Cat

使用 echo 和 cat 測試串列環回的意外結果

  • February 5, 2013

所以我有一個標準的 RS232 串列埠,它通過簡單地從 Tx 到 Rx 執行一條線環回自身。我正在通過執行echocat在兩個單獨的終端中測試環回:

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

  1. echo命令預設在消息末尾附加一個換行符,因此 “hi” + LF 被發送到 /dev/ttyS1
  2. 因為設置了“onlcr”,串口設備將LF轉換為CRLF,所以發送到Tx線的物理消息是“hi”+CRLF
  3. 因為設置了“icrnl”,所以在 Rx 線上接收到的物理消息將 CR 轉換為 LF。所以 ‘cat’ 輸出的資訊是 “hi” + LFLF。
  4. 因為設置了“echo”,所以在 Rx 上接收到的消息(“hi”+LFLF)然後在 Tx 線路上發送回。
  5. 因為 onlcr,“hi” + LFLF 變成了 “hi” + CRLFCRLF。
  6. 因為 icrnl,“hi” + CRLFCRLF 變成了 “hi” + LFLFLFLF
  7. 由於迴聲,“hi” + LFLFLFLF 然後被發送到 Tx

等等…

為了解決這個問題,我執行了以下命令:

stty -F /dev/ttyS1 -echo -onlcr

禁用“echo”可防止消息無限循環,禁用“onlcr”可防止串列設備在輸出時將 LF 轉換為 CRLF。現在cat每次執行時都會收到一個“hi”(帶有一個換行符!)echo

CR = 輸入(ASCII 0x0D);LF = 換行或換行 (ASCII 0x0A)

引用自:https://unix.stackexchange.com/questions/42964