Wenn jetzt das Stop-Zeichen kommt setzt du immer das nächste Zeichen auf 0, richtig? Aber dann kann ich ja schlecht ne 0 empfangen ohne, dass die Position gleich als Ende angesehen wird. Ist doch ungüstig oder?
mfg
jagdfalke
Druckbare Version
Wenn jetzt das Stop-Zeichen kommt setzt du immer das nächste Zeichen auf 0, richtig? Aber dann kann ich ja schlecht ne 0 empfangen ohne, dass die Position gleich als Ende angesehen wird. Ist doch ungüstig oder?
mfg
jagdfalke
schaut euch mal das hier an:
Die Fehlermeldung hier lautet:Code:char inStr[500];
int inCnt = 0;
char stopsign = 'a';
char startsign = 'b';
SIGNAL(SIG_USART_RECV) {
inStr[inCnt] = uart_readChar();
switch (inStr[inCnt])
{
case stopsign:
printf("STOPBIT EMPFANGEN: %s\n\r", inStr);
inCnt=0;
break;
case startsign:
printf("RESTART");
inCnt=0;
break;
default:
inCnt++;
break;
}
}
Was bedeutet das? "does not reduce to an integer constant" ???Zitat:
test.c: In function '__vector_13':
test.c:53: error: case label does not reduce to an integer constant
test.c:57: error: case label does not reduce to an integer constant
make: *** [test.o] Fehler 1
mfg
jagdfalke
Hi,
kannst keine Variable fuer einen Fall verwenden (wert koennte isch dann ja aendern). Nimm einfach ein Define.
Code:#define stopsign 'a'
#define startsign 'b'
Danke, kann man dann auch den Inhalt des Arrays löschen? Damit bei der Ausgaben nicht immer der Datenmüll vom letzten Empfang angezeigt wird?
Wenn du nach dem Stopsign den InIdx NICHT löscht, zeigt er
1 die Länge der Daten an. Nach dem AUSWERTEN setzt du erst auf NULL.
2 isser null, gilt der input als leer, also auch nix zum herzeigen.
Aber bei sowas kommt es jetzt schon sehr auf das Umfeld an, genauso wie mit dem \0 am Schluss. der hat nur einen Sinn bei String-input.
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.