(RXCIE0<<1);
scheint mir verdreht.
sizeof( Line )
wird nicht klappen. verwende einfach die Zahl 40 .
oder besser:
Code:#define MAXLEN 40 char line [MAXLEN] uart_gets(Line, MAXLEN) ;
hallo,
ich sende eine Txt Code über USART, das Problem es liest nur 3 Zahlen dann hört er auf. wie kann man das machen.hier ist der code:
Code:#include <avr/io.h> #include <stdlib.h> #include <stdint.h> #include <avr/interrupt.h> #include <util/delay.h> // Berechnungen #define UBRR_VAL ((F_CPU+BAUD*8)/(BAUD*16)-1) // clever runden #define BAUD_REAL (F_CPU/(16*(UBRR_VAL+1))) // Reale Baudrate #define BAUD_ERROR ((BAUD_REAL*1000)/BAUD) // Fehler in Promille, 1000 = kein Fehler. #ifndef UART_H #define UART_H #define F_CPU 3686400UL #define BAUD 9600UL void uart_init(void) { UCSR0B |= (1<<TXEN0) |(1<<RXEN0)|(RXCIE0<<1); // UART TX einschalten UCSR0C |= (1<<UMSEL01)|(1 << UCSZ01)|(1 << UCSZ00); // Asynchron 8N1 UBRR0H = UBRR_VAL >> 8; UBRR0L = UBRR_VAL & 0xFF; } uint8_t uart_getc(void) { while (!(UCSR0A & (1<<RXC0))) ; return UDR0; } void uart_gets( char* Buffer, uint8_t MaxLen ) { uint8_t NextChar; uint8_t StringLen = 0; NextChar = uart_getc(); while (1) { while( NextChar != ',' && StringLen < MaxLen - 1 ) { UDR0=NextChar+1; PORTB=NextChar; *Buffer++ = NextChar; StringLen++; NextChar = uart_getc(); } } *Buffer = '\0'; } int main(void) { DDRB=0xFF; char Line[40]; // String mit maximal 39 zeichen uint8_t c; uart_init(); uart_gets( Line, sizeof( Line ) ); while (1) { } return 0; // never reached } #endif // UART_H
Geändert von PicNick (23.03.2011 um 13:09 Uhr)
(RXCIE0<<1);
scheint mir verdreht.
sizeof( Line )
wird nicht klappen. verwende einfach die Zahl 40 .
oder besser:
Code:#define MAXLEN 40 char line [MAXLEN] uart_gets(Line, MAXLEN) ;
mfg robert
Wer glaubt zu wissen, muß wissen, er glaubt.
und hier:
void uart_gets( char* Buffer, uint8_t MaxLen )
soll es so bleiben oder auch ändern
nein, das kannst du lassen, wie's is
mfg robert
Wer glaubt zu wissen, muß wissen, er glaubt.
da zeigt er einen Fehler:
../TST_22.c:64: error: expected ';', ',' or ')' before numeric constant
Ahja, das ist, weil die definierte konstante auch "maxlen" heisst (mein fehler).
ändere einfach die konstante
#define MAX_LEN 40
char line [MAX_LEN]
uart_gets(Line, MAX_LEN) ;
mfg robert
Wer glaubt zu wissen, muß wissen, er glaubt.
das hat auch nicht funktiniert, wenn ich zum Beispiel 123456789 sende, der empfängt nur die 2 erste Zahlen 1 und 2 und der letzte 9, aber dazwischen zeigt er nicht
Doch, würde es. sizeof(Line) ist 40.
Vermutlich hast du laufend Soft-Resets. Lass das mit dem RXCIE0 weg (egal ob inzwischen korrigiert, oder nicht). Du arbeitest hier doch gar nicht mit Interrupts.Zitat von amal
Übrigens: was hat denn die Endlosschleife in uart_gets da zu suchen?
MfG
Stefan
Lesezeichen