if (c=='>') { //wenn fertig, '\0' anhängen und Index Resetten
Wo resetest du denn da i? Bzw. wie initialisiert du RS232.i?
Andun
Hallo Leute,
ich möchte an meinen µC einen Befehl senden (na so wein Zufall
Der Befehl soll im Prinzip so aussehen:
<befehl>
Das ganze müsste dann so interpretiert werden:
wenn '<' empfangen, dann
Command[i]=empfangenes_zeichen
i++
wenn '>' empfangen, dann keine weiteren Zeichen mehr aufnehmen.
Das habe ich bisher so versucht zu realisieren:
Schön und gut, wenn ich nun mit uart_puts(RS232.Cmd) versuche den Befehl zurückzusenden bekomme ich im Terminal nur ein "<". Wieso?Code:uint8_t c = uart_getc(); if (c=='<') RS232.Cmd_Start=1; //RS232.Cmd_Start ist ein Bitfeld if (RS232.Cmd_Start==1) { RS232.Cmd[RS232.i]=c; //RS232.Cmd ist ein Char[20] RS232.i++; //ein uint8_t } if (c=='>') { //wenn fertig, '\0' anhängen und Index Resetten RS232.Cmd_Start=0; RS232.Cmd[RS232.i]='\0'; RS232.Cmd_Complete=1; } ... woanders ... if (RS232.Cmd_Complete==1) { lcd_gotoxy(0,1); lcd_puts(RS232.Cmd); uart_puts(RS232.Cmd); RS232.Cmd_Complete=0; }
Wenn ich folgendes sende:
erhalte ich im Terminal "abc", egal ob ich (const char*) RS232.Cmd nehme oder nicht. Ich versteh' nicht, wo mein Denkfehler liegt.Code:RS232.Cmd[0]='a'; RS232.Cmd[1]='b'; RS232.Cmd[2]='c'; RS232.Cmd[3]='\0'; uart_puts(RS232.Cmd);
Vieln Dank,
Simon
Hinweis: Es macht auch keinen Unterschied, wenn ich in der Auswertung (unsigned int)c=='>' anstelle von c=='>' verwende, obwohl's eigentlich korrekter wäre.
P.S.: ATMega32, XTAL=8MHz
if (c=='>') { //wenn fertig, '\0' anhängen und Index Resetten
Wo resetest du denn da i? Bzw. wie initialisiert du RS232.i?
Andun
www.subms.de
Aktuell: Flaschcraft Funkboard - Informationssammlung
Hi Adun.
RS232.i wird in main initialisiert:
RS232.i habe ich vergessen zu resetten. Sollte dort hin:Code:RS232.i=0; for (;;) { rs232_gets(); //funktion, wo zeichen zu string gepackt werden sollen... lcd_gotoxy(0,0); lcd_puts("Eingang:"); if (RS232.Cmd_Complete==1) { lcd_gotoxy(0,1); lcd_puts(RS232.Cmd); uart_puts(RS232.Cmd); RS232.Cmd_Complete=0; } } //ende for
funktion rs232_gets()
Das hatte ich da auch schonmal stehen gehabt. Es macht aber keinen Unterschied. Wo könnte das Problem sein?Code:if (c=='>') { RS232.Cmd_Start=0; RS232.Cmd[RS232.i]='\0'; RS232.Cmd_Complete=1; RS232.i=0; }
VG Simon
Mh ... vielleicht hat noch jemand anderes ne idee?
Andun
www.subms.de
Aktuell: Flaschcraft Funkboard - Informationssammlung
Hi Adun, ich glaube langsam den Fehler zu finden. Und zwar wird das char ab dem '<' immer angehängt. Egal ob danach gleich ein neues char kommt oder eben '0'. Das habe ich folgendermaßen rausgefunden:
Ich habe mir das eingelesene char-array stur ausgeben lassen:
Wenn ich nun "<hello>" übertrage bekomme ich folgendes zurück:Code:for (int u=0; u<10; u++) {uart_putc(RS232.Cmd[u]); }
"< e l l"
Wichtig: Die Leerzeichen haben den Decimal-Wert 000. Und dort liegt der Fehler, das muss ich noch rausfiltern.
Poste meine Ergebnisse hier dann...
Okay, Problem behoben: eine Zeile Code hat's dann getan:
Das if (c!=0) war's!Code:if (c!=0){ if(c=='<') { RS232.Cmd_Start=1; } if(RS232.Cmd_Start==1) { RS232.Cmd[RS232.i]=c; RS232.i++; } if(c=='>') { RS232.Cmd[RS232.i]='\0'; RS232.Cmd_Start=0; RS232.Cmd_Complete=1; RS232.i=0; } }
Jetzt geht's so, wie ich mir das vorstelle.
vG Simon
Lesezeichen