PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : RS232 P. Fleury Char und String Probleme mal wieder



PCMan
30.10.2007, 22:23
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:


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



Schön und gut, wenn ich nun mit uart_puts(RS232.Cmd) versuche den Befehl zurückzusenden bekomme ich im Terminal nur ein "<". Wieso?
Wenn ich folgendes sende:



RS232.Cmd[0]='a';
RS232.Cmd[1]='b';
RS232.Cmd[2]='c';
RS232.Cmd[3]='\0';

uart_puts(RS232.Cmd);


erhalte ich im Terminal "abc", egal ob ich (const char*) RS232.Cmd nehme oder nicht. Ich versteh' nicht, wo mein Denkfehler liegt.
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

Andun
31.10.2007, 11:22
if (c=='>') { //wenn fertig, '\0' anhängen und Index Resetten


Wo resetest du denn da i? Bzw. wie initialisiert du RS232.i?

Andun

PCMan
31.10.2007, 14:44
Hi Adun.
RS232.i wird in main initialisiert:


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

RS232.i habe ich vergessen zu resetten. Sollte dort hin:
funktion rs232_gets()



if (c=='>') {
RS232.Cmd_Start=0;
RS232.Cmd[RS232.i]='\0';
RS232.Cmd_Complete=1;
RS232.i=0;
}


Das hatte ich da auch schonmal stehen gehabt. Es macht aber keinen Unterschied. Wo könnte das Problem sein?
VG Simon

Andun
31.10.2007, 16:43
Mh ... vielleicht hat noch jemand anderes ne idee?

Andun

PCMan
31.10.2007, 16:47
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:


for (int u=0; u<10; u++) {uart_putc(RS232.Cmd[u]); }


Wenn ich nun "<hello>" übertrage bekomme ich folgendes zurück:
"< 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...

PCMan
31.10.2007, 16:52
Okay, Problem behoben: eine Zeile Code hat's dann getan:


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

Das if (c!=0) war's!
Jetzt geht's so, wie ich mir das vorstelle.
vG Simon