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 ;)
> 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.
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.
naja wenn es unfug ist kannst du mir dann sagen wieso es nicht funktioniert?
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 :-)
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').
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.
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 :-)
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.