the*_*avo 5 command-line tty serial-port cat head
我有一个秤,可以通过串行端口连续发送数据,每秒 2 次。读取此数据的唯一可靠方法碰巧是cat
命令。以下工作:
cat /dev/ttyUSB0
Run Code Online (Sandbox Code Playgroud)
但问题cat
在于,由于它没有收到EOF
,它会继续检索数据。我也试过head
,read
和tail
。
head -1 /dev/ttyUSB0 | strings
Run Code Online (Sandbox Code Playgroud)
“几乎”每次都可以工作,但有时会显示旧数据,只有重新运行 cat 命令才能修复它(?)。管道后的字符串仅检索可打印数据。
read line < /dev/ttyUSB0 | echo $line
Run Code Online (Sandbox Code Playgroud)
现在不时检索数据,但大多数时候只显示一个空行。
tail -1 < /dev/ttyUSB0
Run Code Online (Sandbox Code Playgroud)
只是冻结,等待EOF
,也许?
我的问题是我需要编写一个bash
可以调用和“读取”/dev/ttyUSB0
和检索数据的脚本。我要使用head
. 但我想知道,cat
如果有一种方法可以只捕获一行cat
输出然后停止它,那么永远不会失败。
注:端口配置为 9600 波特,1 个起始位,8 个数据位,无奇偶校验,2 个停止位。要正确设置端口,这是命令:
sudo stty -F /dev/ttyUSB0 9600 -parity cs8 cstopb
Run Code Online (Sandbox Code Playgroud)
小智 1
最好的选择是将 tty 置于原始模式,并编写一个程序,该程序丢弃字符直到看到消息的开头,然后打印字符直到到达消息的结尾。将“raw”添加到 后stty
,fgetc()
可以在 tty 上使用来获取单个字符。
即兴伪:
char = fgetc(serial_port);
if char == START_CHARACTER {
putc(char);
for (i=0;i<MESSAGE_LENGTH;i++){
putc(fgetc(serial_port));
}
}
Run Code Online (Sandbox Code Playgroud)
也可以使用 sed 和原始 tty 来完成此操作,请参阅其他问题: /sf/ask/1466011781/第一个匹配地址范围