Hallo, ich möchte ganz simpel über Uart Zeichen einlesen und wieder zurücksenden. Bringe es aber nicht zum Laufen und verstehe nicht wo der Fehler begraben ist. "TEST" wird richtig gesendet also das passt, aber das Einlesen scheint nicht zu funktionieren. Hier mein Code: #define F_CPU 1600000UL #include <xc.h> #include <stdio.h> #include <avr/io.h> #include <avr/interrupt.h> #include <util/delay.h> char text[30]="TEST"; char uart_rcv[30]; uint8_t uart_complete=0; int uart_putc(unsigned char c); void uart_puts (char *s); int uart_putc(unsigned char c) { while (!(UCSR0A & (1<<UDRE0))); UDR0= c; return 0; } void uart_puts (char *s) { while (*s) { uart_putc(*s); s++; } } int main(void) { UCSR0B|= (1<<RXEN0) | (1<<TXEN0) | (1<<RXCIE0); UCSR0C|= (1<<UCSZ00) | (1<<UCSZ01); UBRR0H=0; UBRR0L=103; //9600Baud sei(); uart_puts(text); while(1) { if (uart_complete==1) { uart_puts(uart_rcv); uart_complete=0; } } } ISR (USART_RX_vect) { uint8_t i=0; uart_rcv[i]=UDR0; if (uart_rcv[i]=='.') { i=0; uart_complete=1; uart_rcv[i]='\0'; } else { i++; uart_complete=0; } } Kann mir da bitte jemand weiterhelfen?
Persönlich würde ich das ja nicht unbedingt mit Pointern machen ..... However, erstmal, globale Variablen als volatile deklarieren. Zweitens, in der Interrupt setzt du immer i auf 0. Du beschreibsts jedes mal beim Empfang eines Zeichens das erste Byte vom String.
Jaaaa das wars, uint8_t i=0; muss global definiert werden und darf nicht im interrupt definiert werden, genau :) Und volatile ist ein guter Hinweis, stimmt. Vielen Dank.
Du Sendest "TEST" und wartest beim Empfang auf ein abschließendes '.' das niemals kommt weil du es niemals sendest.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.