Forum: Mikrocontroller und Digitale Elektronik [Atmega32] UART / LCD


von Roman (Gast)


Angehängte Dateien:

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 ;)

von Roman (Gast)


Lesenswert?

ich verwende die LCD-Routine von Peter Fleury

von Stefan B. (stefan) Benutzerseite


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.

von Stefan B. (stefan) Benutzerseite


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)

von Roman (Gast)


Lesenswert?

sorry das Display ist natürlich 16 Zeichen lang ;)

von Karl H. (kbuchegg)


Lesenswert?

Stefan B. schrieb:
> 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?

Indem sich die uart_gets darum kümmert.

von Stefan B. (stefan) Benutzerseite


Lesenswert?

Stimmt, sorry, steht ja oben ("MaxLen - 1").
Also Beitrag "Re: [Atmega32] UART / LCD" ist Unfug.

von Roman (Gast)


Lesenswert?

naja wenn es unfug ist kannst du mir dann sagen wieso es nicht 
funktioniert?

von Karl H. (kbuchegg)


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 :-)

von Roman (Gast)


Lesenswert?

Welches Terminal empfehlt ihr mir zum testen des ganzen?

von Stefan B. (stefan) Benutzerseite


Lesenswert?

http://www.mikrocontroller.net/articles/RS-232#Terminalprogramme

Wenn du Windows benutzt, dann schau dir vielleicht meinen Favoriten 
Br@y++ Terminal an. Dort kannst du die Zeichen in Hexcode eingeben und 
senden ($0A ist das LF = '\n').

von Stefan B. (stefan) Benutzerseite


Lesenswert?

Roman schrieb:

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

Nicht der ganze Thread ist Unfug sondern mein zweiter Betrag! Die 
Textersetzung bei der Verlinkung im Forum ist unglücklich implementiert.

von Bernd (Gast)


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 :-)

von Roman (Gast)


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

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.