wenn ich mich nicht ganz irre kannst du wenn du das stop zeichen erhalten hast einfach ein '\0' eintragen wenn ich mich nicht ganz irre ist das das ende signal für ein string.(zumindest beim PC).
Paladin
also sollte der code in etwas so aussehen
Code:
#define stopsign 'a'
#define startsign 'b'
char inStr[500]; //könnte ein bischen gross sein
int inCnt = 0;
SIGNAL(SIG_USART_RECV) {
inStr[inCnt] = uart_readChar();
switch (inStr[inCnt])
{
case stopsign:
inStr[inCnt]='\0';
printf("STOPBIT EMPFANGEN: %s\n\r", inStr);
inCnt=0;
break;
case startsign:
printf("RESTART");
inCnt=0;
break;
default:
inCnt++;
break;
}
}
dadurch wird aber die ISR eigentlich ziehmlich lang weil print lange dauern kann besser währe es wenn du auf ein start signal wartest und dann in einen buffer schreibst und wenn du ds stop bit erhälts dann soll ein stringready flag gesetzt werden was dann im hauptrogramm abgerufen wird.
Code:
#define stopsign 'a'
#define startsign 'b'
char inStr[500]; //könnte ein bischen gross sein
int inCnt = 0;
flag_string_da=0;
flag_string_lesen=0;
SIGNAL(SIG_USART_RECV) {
unsigned char tmp=UDR; //auslesen der gesendeten daten
if (tmp == startbit)
flag_string_lesen=1;
else if (tmp == startbit){
inStr[count] = '\0';// ende des strings
flag_string_lesen=0;
flag_string_da=1;
// hier kann auch eine eventuelle rücksetztung des count stattfinden je nach auswertung
}
if ( flag_string_lesen==1){
inStr[count++] = tmp;
}
}
in der main muss jetzt nur noch flag_string_da im MAIN ausgewertet werden.
Der code ist nicht getestet aber das prinzip sollte funktionieren ohne dabei alle interrupts oder den controller zu blockieren.
Lesezeichen