我正在連接到 /dev/ttyACM0 上的 USB 串列連接。發送方的代碼會\f
定期發送一個字元。
print("----------------------------\n\r");
print("-- LED CONTROLLER 00.01 --\n\r");
print("----------------------------\n\r");
print("\n\f");
但是,當我cat /dev/ttyACM0
從控制台運行時,輸出會向下滾動螢幕,而不是在頂部刷新。
我已經深入研究了當前stty
設定(透過輸入stty -F /dev/ttyACM0 -a
),它給出了以下輸出:
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
讀取stty --help
頁面會出現換頁延遲 ( ff0
),但不指示如何變更其他任何內容。我還發現這一頁這表明我可以像這樣設定 FormFeed 字符FormFeed=014
,但該語法不適用於我的 stty 版本(stty --version
給出stty (GNU coreutils) 8.5
)。
Windows 中的 Putty 表現出正確的行為,但我很難讓它在 Debian 6 中工作。
答案1
GNU sed 對於解決這個問題並不是必需的(儘管腳本更容易閱讀)。一個最小的腳本是(在 Solaris 和 OSX 上測試):
sed -e 's/^L/^[[H^[[J/g'
其中^L
和是換頁和轉義^[
的文字控製字元。您可以使用(要插入轉義字符,首先鍵入)將它們插入文件中。controlLcontrol[vi
controlV
轉義序列用於
- 將遊標移動到起始位置
^[[H
並 - 清除顯示
^[[J
一些注意事項:
- 沒有必要在轉義中給出行和列
^[[H
(並且在任何情況下,位置以1, 不是0), 和 - 如果螢幕被清除前移動遊標,
2
在轉義中需要 a,例如 ,^[[2J
因為這會清除整個顯示。預設^[[J
清除從目前位置到顯示末端的內容。例如,有些非標準終端ansi.sys
並沒有做出這種區分。
有些人對 bash 使用^L
鍵盤快捷鍵來清除螢幕以及 PuTTY 的解釋感到困惑^L
(請參閱為什麼當我輸入 control/L 時螢幕沒有清除?在 XTerm 常見問題中)。
延伸閱讀:
答案2
您需要將換頁符號 ( \f
) 替換為正確的ANSI 轉義碼。
你可以這樣做GNU sed:
sed 's/\f/\o33[2J\o33[0;0H/g' /dev/ttyACM0
詳細資料:\033[2J
清除螢幕,\033[0;0H
:前往 pos 0,0
(如果這不起作用,請嘗試 tail -f /dev/ttyACM0 | sed 's/\f/\o33[2J\o33[0;0H/g'
)
編輯:作為@MarkReel 評論道,您可以用於非 GNU sed 版本(例如 BSD sed)ANSI 轉義字串:
sed $'s/\f/\e[2J\e[0;0H/g' /dev/ttyACM0
答案3
當您的 FPGA 執行時,print("\n\f")
它實際上在其標準輸出上發送兩個位元組,第一個位元組是換行符,第二個位元組是換頁符。這些位元組是 0x0A 和 0x0C。
然後,標準輸出透過 USB 電纜傳輸,並透過模擬串行設備讀取。這個串行設備只會將兩個位元組傳輸到控制終端(因為您正在透過命令讀取它cat
),並最終傳輸到您的 gnome 終端、xterm 或您正在使用的任何其他程式。此終端仿真器必須理解這兩個位元組並採取相應的行動。
因此,您必須檢查模擬器的功能。您使用的是哪一款?
答案4
由於問題在於 ANSI 終端的正確模擬,我認為最好的選擇是使用minicom
.只要記得在不初始化調變解調器的情況下開啟串列設備,即在啟動時不傳送 hayes 指令。