www.mikrocontroller.net

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


Autor: Matthias (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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:
  printf( "Enter reading loop\n" );
  do
  {
    *pdisp = getchar();
    printf( "Got: %c\n", *pdisp );
    pdisp++;
  } while(*(pdisp-1)!=';');

  *pdisp = '\0';

  printf( "Leaving reading loop" );
  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.

Autor: Obelix (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Was sagt dein debugger?

Autor: Max (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Max (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo

ich muss mich doch korrigieren.

Nach der While-Scleife:

pdisp -- ;

einfügen.

max

Autor: Matthias (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@karl heinz:

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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Matthias (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.