[Atmega32] UART / LCD

Gast #1472784
Lesenswert?

Hallo zusammen,
Ich habe ein Problem mit dem angehängten Code..
Die funktion uart_gets() soll einen String empfangen und auf einem 16 
zeichen langen Display ausgeben.
Dazu habe ich ein 17 Elemente großes Display.
Nun ist das Problem dass erst ein 17 zeichen langer String gesendet 
werden muss bevor es aus dem Display ausgegeben wird.
z.B. muss 3 mal hallo gesendet werden damit es auf dem Display 
erscheint.
Die Ausgabe ist dann hallo(voll ausgefülltes Feld)

hallo(voll ausgefülltes Feld)hallo(voll ausgefülltes Feld)hallo(voll 
ausgefülltes Feld)

hat jemand einen Rat ?

Vielen Dank schonmal im voraus ;)
Angehängte Dateien:
Persönliche Seite #1472798
Lesenswert?

>   while( NextChar != '\n' && StringLen < MaxLen - 1 ) {

Sorge dafür, dass dein Sender die Eingabe mit '\n' (= Linefeed, 
http://www.jimprice.com/jim-asc.shtml) abschliesst. Dann greift die 
erste Ausstiegsbedingung aus obiger Zeile. Im Moment greift nur die 
zweite Bedingung (Puffer voll).

Du kannst auch den Code so umschreiben, dass du mit allen Arten von 
Zeilenende fertig wirst, also nur LF oder nur CR oder CRLF zusammen.
Persönliche Seite #1472811
Lesenswert?

Zweites Problem:

>  char s[17];
>    s[16] = ' ';
>    uart_gets( s, sizeof( s ) );

Ist ein potenzieller Bufferoverflow. Wie ist abgesichert, dass das 
letzte Zeichen in char s[17] ein Nullbyte ist?

  char s[17];
    uart_gets( s, sizeof( s ) - 1 );
    s[16] = '\0';

> Dazu habe ich ein 17 Elemente großes Display.

Wirklich? Das ist ein sehr ungewöhnliches LCD. Gängig wäre ein 16 
Zeichen LCD (passend für den Code oben)
#1472888
Lesenswert?

Roman schrieb:
> naja wenn es unfug ist kannst du mir dann sagen wieso es nicht
> funktioniert?

Weil du dich noch nie gefragt hast, wie es eigentlich funktioniert, dass 
du in einem Buch einzelne Sätze identifizierst, die alle unterschiedlich 
lang sind.
Da wird ein spezielles Zeichen benutzt, nämlich der '.' welcher deinem 
Lesezentrum im Gehirn mitteilt: Hier ist ein Satz zu Ende.

Auch dein µC benötigt ein spezielles Zeichen, welches ihm mitteilt: Hier 
ist der Text jetzt zu Ende. In den meisten Fällen übernimmt \n (also die 
Return Taste) diese Funktion. Darum ist diese Taste auch größer als die 
anderen, weil man sie oft braucht.
Aber es muss ja nicht Return sein. Im Grunde kannst du auch jedes andere 
Zeichen dafür nehmen, dem µC ist das egal. Hauptsache es gibt ein 
eindeutiges Kriterium, welches ganz klar sagt: Jetzt ist der Text zu 
Ende, uart_gets kann jetzt aufhören Zeichen zu sammeln und das 
Empfangene kann angezeigt werden.
Im Moment ist dein uart_gets darauf programmiert, auf \n (also das was 
geschickt wird, wenn du Return drückst) zu reagieren. Aber das lässt 
sich ja auch ändern :-)
Gast #1472956
Lesenswert?

Weil du dich noch nie gefragt hast, wie es eigentlich funktioniert, dass
du in einem Buch einzelne Sätze identifizierst, die alle unterschiedlich
lang sind.
Da wird ein spezielles Zeichen benutzt, nämlich der '.' welcher deinem
Lesezentrum im Gehirn mitteilt: Hier ist ein Satz zu Ende.


Karl Heinz, schreib mal nen Fachbuch... wunderbare Erklärung :-)
Gast #1473343
Lesenswert?

sorry stefan wollte dich nicht so schwär von der seite anmachen..

danke erstmal für eure tipps ich werde mir mal dieses terminal holen und 
noch etwas mit den zeilenendemarkierungen rumspielen vielleicht find ich 
ja noch raus weis geht..

du hast recht Karl Heinz ich versteh das ganze leider noch nihct in 
gänze aber ich arbeite dran ;)

nochmal Danke für eure Tipps..

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren