Bash 从 ttyUSB 读取的行有时会产生损坏的字符

Bash 从 ttyUSB 读取的行有时会产生损坏的字符

我想在我的 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 来寻找正则表达式

相关内容