Ist es möglich, Zeichen über die Seriennummer zu senden, um eine Zeile im Konsolenfenster nach oben zu gehen?

7

Ich denke, es ist möglich, weil ich vi direkt von meiner seriellen Schnittstelle über TeraTerm ausführen kann. Dort kann ich Text bearbeiten, zur nächsten Zeile gehen, dann zurückkommen und die erste Zeile bearbeiten! Wie machen sie das?

Welchen Charakter über UART könnte ich senden, um "eine Zeile nach oben" zu gehen?

EDIT: Anscheinend funktioniert der Zeilenvorschub. "\ f", um den Bildschirm zu löschen. Dies funktioniert jedoch nur für Hyperterminal auf meinem Computer und nicht für Teraterm. Weiß jemand warum?

cksa361
quelle

Antworten:

11

Verwenden Sie VT100-Escape-Codes , um den Cursor zu steuern.

Z.B.

puts("\033[2J");   // clear screen
puts("\033[0;0H"); // set cursor to 0,0
puts("\033[10B");  // move cursor down 10 lines
puts("\033[5A");  // move cursor up 5 lines
Toby Jaffey
quelle
ordentlich muss ich das mal ausprobieren, aber die \ sollten wohl \\ durch sein oder? oder erkennt Puts tatsächlich diese gesamten Zeichenfolgen als einzelne Escape-Codes? Ich bin es gewohnt, Escape-Codes als Backslash zu betrachten, gefolgt von einem Zeichen ...
Vicatcu
1
Eigentlich, egal, ich sehe, dass Sie die oktale Variante von Escape-Codes verwenden und das Escape-Zeichen <ESC> (0x1B = 033 = 27) als Präfix
ausgeben
Also ... was zeichnet den Bildschirm in diesem Fall neu? Tut die Shell nur intelligentes Echo?
Tyblu
Ein echtes VT100-Display würde einen Framebuffer haben, der kontinuierlich neu gezeichnet wird. Auf einem PC emulieren Terminalemulatoren Terminals und machen dasselbe
Toby Jaffey
Ich bin mir ziemlich sicher, dass die obere linke Ecke des Bildschirms 1; 1 statt 0; 0 ist, aber ausgelassene oder als Null angegebene Parameter werden vor den Befehlen A, B, C, D oder H als 1 betrachtet.
Supercat
3

Was Sie in einem Konsolenfenster sehen, ist das Ergebnis eines automatischen Echos (das häufig ein- oder ausgeschaltet werden kann), bei dem das Konsolenprogramm die Zeichen zeichnet, die Sie auf dem Bildschirm senden, oder das Ergebnis des Empfangs von Zeichen. Dies bedeutet, dass es zwei Möglichkeiten gibt, dies zu ändern:

  1. Lassen Sie ein lokales Programm auf dem PC den Bildschirm neu zeichnen.
  2. Lassen Sie das angeschlossene Gerät den Bildschirm neu zeichnen.

Es gibt viele Möglichkeiten, dies zu tun, aber so würde ich mich einer vereinfachten Hobby-Implementierung nähern:

  • Stellen Sie eine Standardlinienbreite wie 80 und eine Anzahl von Zeilen wie 24 ein. Deaktivieren Sie das automatische Echo.
    Alt-Text
  • Ein 80x24-Bildschirm bedeutet 1920 Zeichen pro "Frame" . Wenn das angeschlossene Gerät die Arbeit 1920/BAUDRATE/11erledigt , bedeutet dies eine maximale Bildwiederholfrequenz von etwa 5 Hz bei 115200 Baud (unter Verwendung von 1 Startbit, 1 Stopp, 1 Parität, 8 Daten). .
  • Ordnen Sie die Pfeiltasten bestimmten Zeichen oder Zeichenfolgen zu . Dies kann bereits hinter den Kulissen geschehen. (Für OSX Terminal links : \033[5D; rechts : \033[5C; auf und ab standardmäßig undefiniert.)
  • Programmieren Sie das angeschlossene Gerät so, dass diese Zeichen und / oder Zeichenfolgen erkannt werden, und bewegen Sie die Cursorreferenz entsprechend.
  • Ausgabe über die serielle Leitung nicht nach Zeichen oder Zeichenarray, sondern nach Frame. Behalten Sie insbesondere zwei zeichenlange Arrays von 1921 (1920 + Terminator) bei: eines, in das geschrieben werden soll, während das andere übertragen wird (unter der Annahme, dass Hardware-UART und Interrupts verwendet werden).
  • Das Schreiben in den Bildspeicher kann mit einer Funktion wie der folgenden durchgeführt werden:
    uint8_t framewrite(const char *s, uint8_t row, uint8_t col)
    ... Wo *sbefindet sich Ihr [terminiertes] char-Array rowund colwo soll das erste Zeichen erscheinen? (Die Rückgabe uint8_tdient zur Fehlererkennung.)
  • Sie werden wahrscheinlich Funktionen wünschen mögen uint8_t frame_clear(void), uint8_t frame_shiftrowsdown(void)usw.
  • Um die Cursorposition anzuzeigen, können Sie das aktuelle Zeichen und eine Blackbox oder das Zeichen Ihrer Wahl ( pblinkchar) mit abwechseln framewrite(pblinkchar,cursor_row,cursor_col).
  • Dieselbe Methode kann verwendet werden, um Zeichen an die Cursorposition zurückzuspielen.

Ich bin mir sicher, dass es viel einfachere (ich denke, Software-Leute nennen es "elegant") Möglichkeiten gibt, dies durch Programmieren eines PC-Fensters zu tun, und Sie können wahrscheinlich herausfinden, wie dies durch das Durchstöbern dieses Tutorials geht , aber das Obige ähnelt dem, was ich habe Das haben wir in der Vergangenheit getan und arbeiten für einfache Benutzeroberflächen mit Mikros mit viel freiem Speicher.

Tyblu
quelle
1

Dies ist eine indirekte Antwort auf Ihre Frage. Wenn Sie sich in VI befinden, müssen Sie nur 'k' senden, um den Cursor nach oben zu bewegen.

Auf dieser VT100-Befehlsseite sieht es so aus, als würde die Aufwärtspfeiltaste durch Senden der folgenden Sequenz dargestellt: ESC [ Aoder 0x1B, 0x5B, 0x41. Ich weiß nicht, ob das funktionieren wird, aber ich bin interessiert zu wissen, ob es funktioniert.

W5VO
quelle