Hi, möchte von meiner UART (mit GCC) aus eine Tabelle auf dem Terminal darstellen. Dabei sollen die einzelnen via printf ausgegebenen Zeilen aber nicht durchgescrollt werden, sondern nach Ausgabe der Tabelle wieder oben beginnen. Der Bildschirm auf dem Terminal soll also gelöscht so das ein "stehendes" Bild entsteht. Mit Steuerzeichen habe ich es schon getestet. Leider bin ich weder mit HTERM noch mit Realterm zu einem Ergebnis gekommen. Vielen Dank für die Hilfe.
Dazu gibt es Terminal-Steuersequenzen. Es setzt allerdings voraus, dass man auch vor einem ordentlichen Terminal sitzt (VT100 oder dgl. Emulator); dazu gibts dann z.B. die ncurses-Bibliothek, die sich um den Rest (Cursor bewegen, löschen, einfügen, Farben) kümmert. Wenn du auf dem AVR sitzt, wirst du dich vermutlich auf einen Terminaltypen festlegen müssen, da sich die Steuersequenzen teilweise von Terminal zu Terminal unterscheiden (darum halt ncurses/termcap/terminfo). Such mal nach VT100-Steuersequenzen, die sind recht simpel gehalten.
Das Stichwort heisst: Terminal-Emulation. Such dir ein Terminal raus was die Programme können. zB. VT100 Stelle es drauf ein und benutze die entsprechenden Escape-Sequenzen. Einer der noch vor Hardwareterminals gessesen hat.
Schau mal hier nach Debug Ausgabe von mir, ist ein kleines Programm welches die Steuerkommandos für so eine positionierung (X,Y) für ein VT100 Terminal mit drin hat. Du kannst ja die Serielle Ausgabe für irgendeinen Pin weglassen. Das Programm diente eigentlich dazu eine Seriele Debug Ausgabe auf irgendeinem Pin zu machen falls man mehrere braucht. Gruß Littlegonzo
Mit Putty gehts, aber leider nicht so wie ich es mir vorstelle. Flackert sehr, weil Baudrate wohl zu niedrig mit 56700. Habe mich vorhin verschrieben, der C-Compiler ist ICCPROP und der gibt höhere Übertragungsraten nicht her... Und selbstschreiben mag ich das jetzt nicht. Trotzdem Danke
Kai I. schrieb: > Mit Putty gehts, aber leider nicht so wie ich es mir vorstelle. Flackert > sehr, Soll das ein ständiger Life-Update werden? Wenn ja, dann darfst du nicht einfach nur den Bildschirm löschen. Da musst du etwas raffinierter vorgehen. Am Anfang werden die konstanten Texte ein mal hingemalt und dann bei jedem Update-Durchgang nur die sich veränderten Werte übermalt.
Mh okay das klingt ja erstmal einleuchtend. Heißt das, ich muss den Cursor immer genau an die entsprechende Stelle setzen oder an den entsprechenden Zeilenanfang? Wenn ja, wie?
Das Stichwor lautet immer noch Terminal Emulation. Da gibt es auch Escape Sequenzen mit denen man den Cursor an eine bestimmte Stelle jagen kann. (Aber aufpassen: Wenn du Zahlenfelder hast, hast du das gleiche 'Problem' wie bei einem LCD. Du musst sicherstellen, das auch wirklich alle POsitionen der vorhergehenden Zahl übermalt werden)
Eine einfachere Alternative wäre die Beibehaltung der zyklischen Ausgabe von allem, jedoch ohne Löschen des Bildschirms, sondern stattdessen mit "Cursor home". Das sieht allerdings in den Fällen beknackt aus, in denen unterschiedlich lange Zeilen oder unterschiedlich viele Zeilen zwischen zwei Durchläufen ausgegeben werden. Und es ist natürlich ineffizienter, weil auch feste Texte jedesmal wieder übertragen werden müssen. Allerdings muss bei einer zyklischen Aktualisierung vieler einzelner Textfelder auch deren Cursorposition jedesmal einzeln neu gesetzt werden, so daß man auch hier einen gewissen "Verschnitt" erhalten kann. Was letztendlich effektiver ist, hängt vom Einzelfall des verwendeten Bildschirminhaltes ab. Ist das Verhältnis* statischer Text/dynamischer Text größer 1, lohnt die Einzelausgabe mit Cursorpositionierung, ist das Verhältnis kleiner, ist eine Komplettausgabe effizienter. *) ganz genau: Eine komplette Bildschirmausgabe mit statischem Text und dynamischem Text ohne Positionierung und eine komplette Bildschirmausgabe mit dynamischem Text mitsamt Positionierung
Einwandfrei, habe beides gerade getestet und nutze jetzt erstmal die Cursor Home ESC-Sequenz. Werde mir jetzt ein paar #defines und Funktionen zusammenbauen, dann habe ich eine Deluxedebugausgabe. Für andere, die mal in diesem Thread landen. 1. Putty 2. #define CURSOR_HOME printf("\033[H") Danke nochmal!
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.