Werte(Strings) über Serielle Schnittstelle einlesen ATmega3

Gast #738063
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.
Gast
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
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?
Gast
@ 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.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 18 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.