cat 是唯一可以从串行读取数据的可靠命令吗?

cat 是唯一可以从串行读取数据的可靠命令吗?

我有一个秤,可以通过串行端口连续发送数据,每秒 2 次。读取这些数据的唯一可靠方法恰好是cat命令。以下作品:

cat /dev/ttyUSB0

但问题cat是,由于它没有收到EOF,它会继续检索数据。我也尝试过headread并且tail

head -1 /dev/ttyUSB0 | strings

“几乎”每次都有效,但有时会显示旧数据,只有重新运行 cat 命令才能修复它(?)。管道后的字符串仅检索可打印数据。

read line < /dev/ttyUSB0 | echo $line

有时会检索数据,但大多数时候只显示空行。

tail -1 < /dev/ttyUSB0

只是冻结,等待EOF,也许?

我的问题是我需要编写一个bash可以调用、“读取”/dev/ttyUSB0和检索数据的脚本。我要使用head.但我想知道,因为cat永远不会失败,是否有一种方法可以只捕获一行cat输出然后停止它。

注:端口配置为 9600 波特率、1 个起始位、8 个数据位、无奇偶校验、2 个停止位。要正确设置端口,请执行以下命令:

sudo stty -F /dev/ttyUSB0 9600 -parity cs8 cstopb

答案1

最好的选择是将 tty 置于原始模式,并编写一个程序,该程序丢弃字符直到看到消息的开头,然后打印字符直到到达消息的结尾。将“raw”添加到 后sttyfgetc()可以在 tty 上使用来获取单个字符。

即兴伪:

char = fgetc(serial_port);
if char == START_CHARACTER {
    putc(char);
    for (i=0;i<MESSAGE_LENGTH;i++){
        putc(fgetc(serial_port));
    }
}

也可以使用 sed 和原始 tty 来完成此操作,请参阅另一个问题: https://stackoverflow.com/questions/20943025/how-can-i-get-sed-to-quit-after-the-first-matching-address-range

相关内容