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


17

因此,我有一个标准的RS232串行端口,只需通过一条从Tx到Rx的导线即可将其环回。我通过运行测试环路echocat在两个独立的终端:

cat /dev/ttyS1
echo "hi" > /dev/ttyS1

我的问题是输出。我希望看到一个“ hi”回到运行猫的终端,但是我得到了:

hi
[2 newlines]
hi
[4 newlines]
hi
[8 newlines]
hi
[16 newlines]
hi
[32 newlines]
hi

...依次类推,直到I ctrl+ 为止c cat

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

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

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


可能是因为有两个进程打开同一设备造成的?如果您运行tip /dev/ttyS1~.退出)并尝试在那里键入数据怎么办?连接导线时,它应该显示在您的终端中,因为它接收到已传输的内容。
mrb 2012年

3
真的要换行,还是回车/换行对?区别在您的工作级别上很重要。尝试“ cat / dev / ttyS1> somefile”,然后执行“ od -x somefile”以查看确切的字节是从TTY设备文件中输出的。另外,执行“ stty -F / dev / ttyS1 -a”。阅读手册页中的“ stty”,并查看stty输出告诉您的每个小设置。RS232串行通信非常棘手。
Bruce Ediger

Answers:


21

感谢布鲁斯的第二条评论,我能够自己解决问题。

运行后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)


-icrnl为我做了把戏。
tcpaiva

3

将文件串联到串行tty中进行测试时,我也遇到了类似的问题。除了可接受的答案:

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

通过stty执行简单操作stty raw -F /dev/ttyS0将阻止终端插入/替换字符(例如[...] 0x0A [...]-> [...] 0x0D 0x0A [...])。该raw标志更改了终端的模式,因此不执行输入和输出处理。


1
嗯... stty raw默认情况下不会禁用回显。您可能需要做stty raw -echo
BMiner 2013年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.