Forum: Mikrocontroller und Digitale Elektronik Werte(Strings) über Serielle Schnittstelle einlesen ATmega3


von Matthias (Gast)


Lesenswert?

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?

von Karl H. (kbuchegg)


Lesenswert?

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.

von Obelix (Gast)


Lesenswert?

Was sagt dein debugger?

von Max (Gast)


Lesenswert?

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

von Max (Gast)


Lesenswert?

Hallo

ich muss mich doch korrigieren.

Nach der While-Scleife:

pdisp -- ;

einfügen.

max

von Matthias (Gast)


Lesenswert?

@karl heinz:

hab ich probiert, funktioniert nicht...
alles läuft prima BIS zur schleife...
da hängt sich das programm komischerweise auf...

von Karl H. (kbuchegg)


Lesenswert?

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?

von Matthias (Gast)


Lesenswert?

@ 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...

von Karl H. (kbuchegg)


Lesenswert?

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
Noch kein Account? Hier anmelden.