echo和cat测试串口回环异常问题
现象描述
将/dev/ttyS1节点对应的硬件TX与RX连接,输入下面的测试命令:
cat /dev/ttyS1 &
echo "shit" > /dev/ttyS1
输出有问题,cat接收没有停止,直到杀死cat进程或断开物理上TXRX的连接
原因分析
在运行stty -a -F /dev/ttyS1之后,我发现有3个选项导致了这个问题:“echo”, “onlcr”,和"icrnl".由于这个串行端口被循环回自身,以下是运行echo “hi” > /dev/ttyS1后发生的情况:
- 默认情况下,echo命令在消息末尾附加一个换行符,因此“shit”+ LF将被发送到/dev/ttyS1.
- 由于设置了“onlcr”,串行设备将LF转换为CRLF,因此发送的Tx物理消息为“shit”+ CRLF.
- 由于设置了“icrnl”,Rx收到的物理消息将CR转换为LF。所以’cat’输出的消息是"shit" + LFLF.
- 因为设置了“echo”,在Rx上接收到的消息(“shit”+ LFLF),然后在Tx上被发送出去
- 由于"onlcr",“shit”+ LFLF变成了“shit”+ CRLFCRLF
- 由于"icrnl",“shit”+ CRLFCRLF 变成了“shit”+ LFLFLFLF
- 由于"echo",“shit”+ LFLFLFLF 被发送到了TX.
- 如此循环…
解决方案
利用stty命令去掉默认的回显参数:
stty -F /dev/ttyS1 -echo -onlcr
禁用“echo”可防止无限循环的消息,禁用“onlcr”可防止串行设备在输出时将LF转换为CRLF
附加
CR = carriage return (ASCII 0x0D); LF = line feed or newline (ASCII 0x0A)