Hi,
ich versuche mehrere Zeichen(Strings unterschiedlicher Länge) per RS232 vom PC auf den AtMega und zurück zu übertragen.
Leider hab ich keine Ahnung woran ich erkenne wann das letzte Zeichen übertragen wurde. Deshalb hab ich einfach gesagt die '#' solls sein.
Leider läuft das so nicht.
Anbei der Quellcode. Neben dem Interrupt gesteuerte Zeicehempfang läuft noch ein Timer mit dem ich ne Led Blinken lasse.
Ich bin für jeden Tipp dankbar der Licht in mein Dunkel bringt. :/
Code:#include <avr/io.h> #include "SeriellBiblio.h" #include <progmem.h> #include <avr/signal.h> #include <avr/interrupt.h> #include <avr/string.h> //Arbeitstakt angeben #define SYSCLK 8000000UL //usart ansprechen volatile unsigned char *data; volatile int count=0; volatile unsigned char b; void timer (void){ TIMSK=_BV(TOIE0); //overflow flag setzen--> ab jetzt kan overflow interrupt ausgelöst werden TCNT0 = 0; //Rücksetzen des Timers TCCR0 = _BV(CS02); //Prescaler 256 sei (); //interrupts ein } int main(void) { USART_Init (); timer (); //sei(); //unsigned char data = 0; DDRB = 0xff; PORTB=0xff; for (;;) { //data = USART_receive (); //darf erst vergleichen wenn nicth mehr gesendet wird... hmmm if(b=='1'){ if (strstr((char*)data, "1#")){ PORTB = 0x00; data=""; } else if (strstr((char*)data, "0#")){ PORTB = 0xff; data=""; } else if (strstr((char*)data, "Steffen#")){ USART_transmit_string("Hallo Steffen");//(char*)data data=""; } else if (strstr((char*)data, "Jana#")){ USART_transmit_string("Hallo Jana");//(char*)data data=""; } b='0'; } } return 0; } //intterrupt wenn byte empfangen SIGNAL (SIG_UART_RECV){ data+=UDR;//hänge neues byte an if (UDR=='#')b='1'; //prüft ob Receive complete } //lässt led blinken SIGNAL (SIG_OVERFLOW0) { count++; if (count==4){ if(PORTB & (1<<PB0)){ PORTB&=~(1<<PB0); count=0; } else{ PORTB|=(1<<PB0); count=0; } } }







Zitieren

Lesezeichen