Ich verbinde mich mit einer USB-Seriell-Verbindung auf /dev/ttyACM0. Der Code auf der Senderseite sendet \f
in 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/ttyACM0
von der Konsole aus ausführe, wird die Ausgabe auf meinem Bildschirm nach unten gescrollt, anstatt oben aktualisiert zu werden.
stty
Ich 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 --help
Seite 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 --version
gibt 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 ^L
und ^[
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
^[[H
und - 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
2
wäre ein Escape-Zeichen erforderlich, z. B.^[[2J
, da dies die gesamte Anzeige löscht. Die Standardeinstellung^[[J
löscht von der aktuellen Position bis zum Ende der Anzeige. Einige nicht standardmäßige Terminals, z. B.,ansi.sys
machten diese Unterscheidung nicht.
Einige Leute sind verwirrt über die Verwendung von in Bash ^L
als 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[2J
Bildschirm 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 cat
Befehl 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.