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

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

因此,我有一个标准 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

  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”+ 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标志改变终端的模式,因此不执行输入和输出处理。

相关内容