![使用 echo 和 cat 測試串列環回的意外結果](https://rvso.com/image/23962/%E4%BD%BF%E7%94%A8%20echo%20%E5%92%8C%20cat%20%E6%B8%AC%E8%A9%A6%E4%B8%B2%E5%88%97%E7%92%B0%E5%9B%9E%E7%9A%84%E6%84%8F%E5%A4%96%E7%B5%90%E6%9E%9C.png)
因此,我有一個標準 RS232 串行端口,只需從 Tx 到 Rx 連線即可環回其自身。我正在通過在兩個單獨的終端中運行echo
和來測試環回:cat
cat /dev/ttyS1
echo "hi" > /dev/ttyS1
我的問題是輸出。我希望在運行 cat 的終端機上看到一個“hi”,但我得到的是:
hi
[2 newlines]
hi
[4 newlines]
hi
[8 newlines]
hi
[16 newlines]
hi
[32 newlines]
hi
....依此類推,直到我ctrl+ c cat
。
中斷 cat 後,如果我再次運行它,它不會輸出“hi”,直到我第二次運行 echo 。
這是正常的嗎?知道為什麼我會看到這種行為嗎?
編輯:我所說的換行符是指 ASCII 0x0A
。此輸出中沒有回車符。
答案1
感謝布魯斯的第二條評論,我能夠自己解決問題。
運行後stty -a -F /dev/ttyS1
,我發現有 3 個選項導致了這個問題:「echo」、「onlcr」和「icrnl」。
由於此串列埠環回自身,因此運行後發生的情況如下echo "hi" > /dev/ttyS1
:
- 該
echo
命令預設在訊息末尾附加換行符,因此「hi」+ LF 被傳送到 /dev/ttyS1 - 由於設定了“onlcr”,串行設備將 LF 轉換為 CRLF,因此從 Tx 線路發出的物理訊息為“hi”+ CRLF
- 由於設定了“icrnl”,因此在 Rx 線路上接收到的實體訊息將 CR 轉換為 LF。所以'cat'輸出的訊息是“hi”+ LFLF。
- 由於設定了“echo”,因此在 Rx 上收到的訊息(“hi”+ LFLF)隨後在 Tx 線路上發回。
- 因為onlcr,「hi」+LFLF 變成了「hi」+CRLFCRLF。
- 由於 icrnl,「hi」+ CRLFCRLF 變成了「hi」+ LFLFLFLF
- 由於迴聲,“hi”+ LFFLFLF 隨後被發送出 Tx
等等...
為了解決這個問題,我運行了以下命令:
stty -F /dev/ttyS1 -echo -onlcr
停用「echo」可防止訊息無限循環,停用「onlcr」可防止序列裝置在輸出時將 LF 轉換為 CRLF。現在cat
每次運行時都會收到一個“hi”(帶有一個換行符!)echo
。
CR = 回車符(ASCII 0x0D); LF = 換行或換行符 (ASCII 0x0A)
答案2
我也遇到了類似的問題,將文件連接到串行 tty 中進行測試。除了已接受的答案之外:
如果您透過執行以下操作來測試序列輸出:cat somefile.txt > /dev/ttyS0
,如果您正在測試確切的位元組值,它將有大量意外的位元組資料。
執行stty
一個簡單的操作stty raw -F /dev/ttyS0
將阻止終端插入/替換字元(例如[...] 0x0A [...]
-> [...] 0x0D 0x0A [...]
)。此raw
標誌改變終端的模式,因此不執行輸入和輸出處理。