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;
	 }
	}
}