[Atmega32] UART / LCD

Gast #1472784
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
>   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
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)
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.
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
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
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

Eine eigene Frage? Dieser Thread ist über 17 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.