我想在我的 Ubuntu PC 上通过串行从外部设备 (ttyUSB) 逐行读取。我有以下脚本:
while true;
do
read line < /dev/ttyUSB0
echo $line
done
问题是,有时某些行或部分行会损坏。它看起来或多或少是这样的:
Long line which is ok
some text which is ok�J�� some text which is OK
Long lines which are OK
����Osome text which is OK
如果连续收到更多行(或者行与行之间没有停顿),问题似乎会变得更加严重。
我怀疑我的串行适配器可能存在问题。但是,我尝试使用 PuTTY 读取串行数据,一切正常。
如果我将脚本与 PuTTY 并行运行,我甚至可以使脚本正常工作。在这种情况下,我的脚本给出了正确的输出,而在 Putty 中几乎没有收到数据 - 可能每 20 个字符一次(这被理解为串行设备一次只能被一个应用程序读取)
因此我认为这是一个串行端口配置的问题,PuTTY 操作正确,而我的脚本却不正确。
PuTTY 使用默认配置:波特率 115200、位:8、停止:1、奇偶校验:无、流量控制:XON/XOFF
我尝试在脚本中设置与 Putty 中完全相同的配置
stty -F /dev/ttyUSB0 115200 cs8 -cstopb -parenb ixon
但问题依然存在。
有人还有其他想法吗?
答案1
两件事情:
1-您的脚本实际上每次读取一行时都会打开和关闭串行线,这可能会导致错过字符或行。
您可以使用不同的方法修复它,例如这个:
(
while test "${LINE}" != "foo"
do
read LINE
done
) < /dev/ttyUSB0
(我不明白为什么这个错误会产生随机字符)
2-但实际上,正如评论中所讨论的那样,这是一个简单的grep
grep --quiet --max-count=1 -F "foo" /dev/ttyUSB0
- 安静:不需要用串行线流污染标准输出
- max-count: 第一次匹配成功退出
- 固定字符串:不要浪费 CPU 来寻找正则表达式