Cat
使用 echo 和 cat 測試串列環回的意外結果
所以我有一個標準的 RS232 串列埠,它通過簡單地從 Tx 到 Rx 執行一條線環回自身。我正在通過執行
echo
並cat
在兩個單獨的終端中測試環回:cat /dev/ttyS1 echo "hi" > /dev/ttyS1
我的問題是輸出。我希望看到一個“hi”在終端執行 cat 上回來,但我得到了這個:
hi [2 newlines] hi [4 newlines] hi [8 newlines] hi [16 newlines] hi [32 newlines] hi
…依此類推,直到 I
ctrl
+c
cat
.中斷 cat 後,如果我再次執行它,它不會輸出“hi”,直到我第二次執行 echo。
這是正常的嗎?知道為什麼我會看到這種行為嗎?
編輯:換行,我的意思是 ASCII
0x0A
。此輸出中沒有輸入。
感謝布魯斯的第二條評論,我能夠自己找出問題所在。
執行後
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” + LFLFLFLF 然後被發送到 Tx
等等…
為了解決這個問題,我執行了以下命令:
stty -F /dev/ttyS1 -echo -onlcr
禁用“echo”可防止消息無限循環,禁用“onlcr”可防止串列設備在輸出時將 LF 轉換為 CRLF。現在
cat
每次執行時都會收到一個“hi”(帶有一個換行符!)echo
。CR = 輸入(ASCII 0x0D);LF = 換行或換行 (ASCII 0x0A)