Wie konfiguriere ich meine TTY-Sitzung so, dass ein Formfeed-Zeichen „\f“ das Terminal löscht?

Wie konfiguriere ich meine TTY-Sitzung so, dass ein Formfeed-Zeichen „\f“ das Terminal löscht?

Ich verbinde mich mit einer USB-Seriell-Verbindung auf /dev/ttyACM0. Der Code auf der Senderseite sendet \fin regelmäßigen Abständen ein Zeichen.

    print("----------------------------\n\r");
    print("-- LED CONTROLLER 00.01   --\n\r");
    print("----------------------------\n\r");
    print("\n\f");

Wenn ich es jedoch cat /dev/ttyACM0von der Konsole aus ausführe, wird die Ausgabe auf meinem Bildschirm nach unten gescrollt, anstatt oben aktualisiert zu werden.

sttyIch habe die aktuellen Einstellungen durchsucht (durch Eingabe von stty -F /dev/ttyACM0 -a), was zu folgender Ausgabe führt:

speed 115200 baud; rows 0; columns 0; line = 0;
intr = ^C; quit = ^\; erase = ^?; kill = ^U; eof = ^A; eol = <undef>; eol2 = <undef>; swtch = <undef>; start = ^Q; stop = ^S; susp = ^Z; rprnt = ^R; werase = ^W; lnext = ^V;
flush = ^O; min = 1; time = 0;
-parenb -parodd cs8 hupcl -cstopb cread -clocal -crtscts
-ignbrk -brkint -ignpar -parmrk -inpck -istrip -inlcr -igncr -icrnl -ixon -ixoff -iuclc -ixany -imaxbel -iutf8
-opost -olcuc -ocrnl -onlcr -onocr -onlret -ofill -ofdel nl0 cr0 tab0 bs0 vt0 ff0
-isig -icanon -iexten -echo -echoe -echok -echonl -noflsh -xcase -tostop -echoprt -echoctl -echoke

Beim Lesen der stty --helpSeite wird die Formularvorschubverzögerung ( ff0) angezeigt, aber es wird nicht angegeben, wie man sonst etwas ändern kann. Ich habe auch gefundendiese Seitewas darauf hinweist, dass ich das FormFeed-Zeichen wie folgt festlegen kann FormFeed=014, aber diese Syntax hat für meine Stty-Version nicht funktioniert ( stty --versiongibt stty (GNU coreutils) 8.5).

Putty verhält sich unter Windows korrekt, aber ich habe Probleme, es unter Debian 6 zum Laufen zu bringen. Weiß jemand, wie ich stty so konfigurieren kann, dass ein Formularvorschub als Löschen des Terminals interpretiert wird?

Antwort1

GNU sed ist zur Lösung dieses Problems nicht unbedingt erforderlich (das Skript ist jedoch leichter zu lesen). Ein minimales Skript ist (getestet mit Solaris und OSX):

sed -e 's/^L/^[[H^[[J/g'

wobei ^Lund ^[die wörtlichen Steuerzeichen für Form-Feed controlLund Escape sind control[. Sie können diese in eine Datei einfügen, indem Sie verwenden vi(zum Einfügen des Escape-Zeichens geben Sie zuerst ein controlV).

Die Escape-Sequenzen werden verwendet, um

  • Bewegen Sie den Cursor zur Home-Position ^[[Hund
  • die Anzeige löschen^[[J

Einige Anmerkungen:

  • Es ist nicht notwendig, die Zeile und Spalte im Escape anzugeben ^[[H(und in jedem Fall beginnen die Positionen mit1, nicht0), Und
  • wenn der Bildschirm gelöscht wäreVorBeim Bewegen des Cursors 2wäre ein Escape-Zeichen erforderlich, z. B. ^[[2J, da dies die gesamte Anzeige löscht. Die Standardeinstellung ^[[Jlöscht von der aktuellen Position bis zum Ende der Anzeige. Einige nicht standardmäßige Terminals, z. B., ansi.sysmachten diese Unterscheidung nicht.

Einige Leute sind verwirrt über die Verwendung von in Bash ^Lals Tastenkombination zum Löschen des Bildschirms sowie über die Interpretation von in PuTTY ^L(sieheWarum wird der Bildschirm nicht gelöscht, wenn ich Strg/L eingebe?in den XTerm-FAQ).

Weiterführende Literatur:

Antwort2

Sie müssen das Formularvorschubzeichen ( \f) durch ein geeignetes ersetzenANSI-Escape-Codes.

Dies können Sie tun mitGNU sed:

sed 's/\f/\o33[2J\o33[0;0H/g' /dev/ttyACM0

Im Detail: \033[2JBildschirm löschen, \033[0;0H: Gehe zu Pos 0,0

(Wenn dies nicht funktioniert, versuchen Sie es mit tail -f /dev/ttyACM0 | sed 's/\f/\o33[2J\o33[0;0H/g')

EDIT: als@MarkReel kommentierte, Sie können für Nicht-GNU-sed-Versionen (z. B. BSD-sed) ANSI-Escape-Zeichenfolgen verwenden:

sed $'s/\f/\e[2J\e[0;0H/g' /dev/ttyACM0 

Antwort3

Wenn Ihr FPGA dies ausführt, print("\n\f")sendet es tatsächlich zwei Bytes an seinen Standardausgang, das erste ist ein Zeilenvorschub und das zweite ein Seitenvorschub. Diese Bytes sind 0x0A und 0x0C.

Anschließend wird die Standardausgabe über das USB-Kabel übertragen und über ein emuliertes serielles Gerät gelesen. Dieses serielle Gerät überträgt einfach beide Bytes an das steuernde Terminal (da Sie es über den catBefehl lesen) und schließlich an Ihr Gnome-Terminal, Xterm oder ein anderes von Ihnen verwendetes Programm. Dieser Terminalemulator muss beide Bytes verstehen und entsprechend handeln.

Sie müssen also die Fähigkeiten Ihres Emulators überprüfen. Welchen verwenden Sie?

Antwort4

Da es sich bei dem Problem um die korrekte Emulation eines ANSI-Terminals handelt, ist meiner Meinung nach die beste Option, eine Verbindung zum Seriell-zu-USB-Konverter über herzustellen minicom. Denken Sie daran, das serielle Gerät zu öffnen, ohne das Modem zu initialisieren, d. h. ohne beim Start Hayes-Befehle zu senden.

verwandte Informationen