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