使用 echo 和 cat 测试串行环回的意外结果

Kri*_*ina 21 echo serial-port cat

所以我有一个标准的 RS232 串行端口,它通过简单地从 Tx 到 Rx 运行一条线来环回自身。我正在通过运行echocat在两个单独的终端中测试环回:

cat /dev/ttyS1
echo "hi" > /dev/ttyS1
Run Code Online (Sandbox Code Playgroud)

我的问题是输出。我希望在运行 cat 的终端上看到一个“嗨”回来,但我得到了这个:

hi
[2 newlines]
hi
[4 newlines]
hi
[8 newlines]
hi
[16 newlines]
hi
[32 newlines]
hi
Run Code Online (Sandbox Code Playgroud)

...依此类推,直到 I ctrl+ c cat

打断 cat 后,如果我再次运行它,它不会输出“hi”,直到我第二次运行 echo。

这是正常的吗?知道为什么我会看到这种行为吗?

编辑:换行,我的意思是 ASCII 0x0A。此输出中没有回车。

Kri*_*ina 23

感谢布鲁斯的第二条评论,我能够自己找出问题所在。

运行后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
Run Code Online (Sandbox Code Playgroud)

禁用“echo”可防止消息无限循环,禁用“onlcr”可防止串行设备在输出时将 LF 转换为 CRLF。现在cat收到一个“喜”(与单个新行!)每次我运行时间echo

CR = 回车(ASCII 0x0D);LF = 换行符或换行符 (ASCII 0x0A)


小智 5

我在将文件连接到串行 tty 以进行测试时也遇到了类似的问题。除了接受的答案:

如果您通过执行以下操作来测试串行输出:cat somefile.txt > /dev/ttyS0,如果您正在测试确切的字节值,它将有大量意外的字节数据。

stty做一个简单的stty raw -F /dev/ttyS0将停止从插入端子/更换字符(例如[...] 0x0A [...]- > [...] 0x0D 0x0A [...])。该raw标志更改终端的模式,因此不执行输入和输出处理。

  • 嗯……看起来 `stty raw` 不会默认禁用回显。您可能需要执行`stty raw -echo`。 (3认同)