Hallo zusammen... Nachdem ich das Forum durchsöbert habe und keine genaue Antwort auf mein Problem gefunden habe eröffne ich diesen Beitrag und hoffe auf eure Hilfe! Danke im Vorraus! Also: Ich muss über die Serielle Strings einlesen. Die Strings sehen so aus: "Test 123 blabla 456;" also in so nem String kann alles drinnen stehen (buchst,zahlen,zeilenumbrücke etc) WICHTIG: zum Schluss ein ; So weiß ich wann "schluss" ist, da mir die Länge des empangenen Strings nicht immer bekannt ist. Codeausschnitt: ###################################### char disp[64]; unsigned char *pdisp; pdisp=disp; . .. . do { *pdisp = getchar(); pdisp++; }while(*(pdisp-1)!=';'); ########################################## Die "andere Richtung" funktioniert, also wenn ich befehle schicke zB printf("W00230011;"); Kann mir wer sagen wiso das einlesen so nicht funktioniert bzw wie ich es anders machen kann?
Matthias wrote: > Kann mir wer sagen wiso das einlesen so nicht funktioniert Dein Code Schnipsel ist grundsätzlich in Ordnung. Dein Problem muss also in den Teilen liegen die du nicht gezeigt hast. Hast du zb. vergessen den String mit einem '\0' Character abzuschliessen? > bzw wie ich > es anders machen kann? Fang mal damit an, dass du alle Zeichen, die du über getchar empfängst, sofort in die Gegenrichtung zurückschickst. Damit kannst du schon mal sehen, ob alles richtig ankommt. Dann hängst du dir zusätzlich noch ein paar Testausgaben rein, die dir ermöglichen nachzuvollziehen, wann welche Schleife betreten wird, wann sie beendet wird, etc. Kurz gesagt: Du musst dein Programm in die Lage versetzten, dir als Programmierer mitzuteilen, was es gerade tut:
1 | printf( "Enter reading loop\n" ); |
2 | do
|
3 | {
|
4 | *pdisp = getchar(); |
5 | printf( "Got: %c\n", *pdisp ); |
6 | pdisp++; |
7 | } while(*(pdisp-1)!=';'); |
8 | |
9 | *pdisp = '\0'; |
10 | |
11 | printf( "Leaving reading loop" ); |
12 | printf( "Recevied string: '%s'\n", disp ); |
Auf die Art erzählt dir das Programm was es gerade tut. Durch Ausgabe von Variablen an strategischen Stellen, kannst du nachvollziehen, was, wann und warum passiert ist. Daraus ziehst du dann deine Schlüsse und korrigierst identifizierte Probleme.
Hallo, Du liest ein Zeichen zuviel ein. Eine While-Schleife könnte helfen. z.B. while( (*pdisp++ = getch() ) != ';' ) ; *pdisp = '\0'; // ';' wird jetzt vüberschrieben Ohne Gewähr und nicht getestet! Gruß max
Hallo ich muss mich doch korrigieren. Nach der While-Scleife: pdisp -- ; einfügen. max
@karl heinz: hab ich probiert, funktioniert nicht... alles läuft prima BIS zur schleife... da hängt sich das programm komischerweise auf...
Matthias wrote: > @karl heinz: > > hab ich probiert, funktioniert nicht... > alles läuft prima BIS zur schleife... > da hängt sich das programm komischerweise auf... Zeig mal das ganze Programm. Hast du ausprobiert, ob du einzelne Zeichen lesen kannst? Wo kommt der Input her?
@ karl heinz buchegger danke für den tipp... das ganze hängt sich auf wenn ich getchar() aufrufe... das ist des pudels kern... hast du ne lösung parat? wäre super! danke jetz schon für deine bemühungen...
Matthias wrote: > @ karl heinz buchegger > > danke für den tipp... > das ganze hängt sich auf wenn ich getchar() aufrufe... > das ist des pudels kern... > hast du ne lösung parat? wäre super! danke jetz schon für deine > bemühungen... Du weist schon dass getchar auf einen Return wartet? Wozu brauchst du eigentlich getchar()? Ein Character von der Seriellen zu lesen, reichen die ganz normalen UART Routinen wie sie im AVR-gcc Tutorial angeführt sind.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.