mikrocontroller.net

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


Autor: Roman (Gast)
Datum:
Angehängte Dateien:

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

Autor: Roman (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ich verwende die LCD-Routine von Peter Fleury

Autor: Stefan B. (stefan) Benutzerseite
Datum:

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

Autor: Stefan B. (stefan) Benutzerseite
Datum:

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

Autor: Roman (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
sorry das Display ist natürlich 16 Zeichen lang ;)

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

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

Autor: Stefan B. (stefan) Benutzerseite
Datum:

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

Autor: Roman (Gast)
Datum:

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

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

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

Autor: Roman (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Welches Terminal empfehlt ihr mir zum testen des ganzen?

Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
http://www.mikrocontroller.net/articles/RS-232#Ter...

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

Autor: Stefan B. (stefan) Benutzerseite
Datum:

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

Autor: Bernd (Gast)
Datum:

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

Autor: Roman (Gast)
Datum:

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

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.