我使用 cutecom 作为串行端口,因为它有时间戳,因为我需要引用两个不同的数据。但我无法记录带有时间戳的数据,并且需要毫秒级的精度。有什么建议吗?
谢谢,塞利姆。
答案1
如果你不需要终端仿真器,你可以使用带有时间戳记录所有 i/o 的socat
选项-v
。例如,
socat -v READLINE /dev/ttyS0,b19200,raw,echo=0 2>/tmp/log
ttyS0
此命令的标准输入中输入的任何内容都将以给定的波特率等发送到串行端口。并且来自串行端口的任何输入都将出现在标准输出中。/tmp/log
您将在其中找到类似以下行
> 2019/11/06 13:56:27.996129 length=6 from=0 to=5
hello
< 2019/11/06 13:56:37.024451 length=8 from=0 to=7
my reply
这相当于输入“hello\n”并得到返回的“我的回复”。
答案2
使用 ts!
在任何 Unix 和适用于 Linux 的 Windows 子系统(又名 WSL)上,您都可以安装moreutils
包含该ts
工具的软件包。ts
将时间戳添加到输入到其标准输入的文本数据中。
安装例如在 Ubuntu 上:
$ sudo apt-get install moreutils
用法
假设你的串行端口是,ttyS70
你可以运行此命令行来
- 从该端口读取串行数据(使用
cat
), - 添加时间戳(使用
ts
),然后 - 打印出结果行并同时将其保存到文件中(使用
tee
):
$ cat /dev/ttyS70 | ts | tee logfile
对于我的串行数据,结果如下所示:
Feb 14 18:37:03 13438 1 0 0.0 19 -80.00 0.00 1
Feb 14 18:37:03 13440 1 0 0.0 19 -80.00 0.00 1
Feb 14 18:37:04 13441 1 0 0.0 19 -80.00 0.00 1
Feb 14 18:37:04 13442 1 0 0.0 19 -80.00 0.00 1
Feb 14 18:37:04 13444 1 0 0.0 19 -80.00 0.00 1
在此示例中,串行端口每秒接收多行。由于时间戳分辨率为秒,因此多行具有相同的时间戳。要添加具有更高分辨率的时间戳,ts
您可以控制时间戳的格式。例如,%.s
将以亚秒级分辨率为您提供自 1970 年以来的秒数:
$ cat /dev/ttyS70 | ts %.s | tee logfile
结果是
1676396776.277146 18963 1 0 0.0 19 -80.00 0.00 1
1676396776.405363 18964 1 0 0.0 19 -80.00 0.00 1
1676396776.532999 18966 1 0 0.0 19 -80.00 0.00 1
1676396776.660920 18967 1 0 0.0 19 -80.00 0.00 1
1676396776.789261 18968 1 0 0.0 19 -80.00 0.00 1
1676396776.917136 18969 1 0 0.0 19 -80.00 0.00 1
如果你不需要绝对时间数据,请使用开关-s
。这将为你提供自程序启动以来经过的时间:
$ cat /dev/ttyS70 | ts -s %.s | tee logfile
结果是
0.072230 6459 42 0 0.0 20567 -100.00 0.00 1
0.199964 6459 42 0 0.0 20567 -100.00 0.00 1
0.311792 6460 42 0 0.0 20568 -100.00 0.00 1
0.439221 6460 42 0 0.0 20566 -100.00 0.00 1
0.567191 6460 42 0 0.0 20566 -100.00 0.00 1
0.694773 6460 42 0 0.0 20566 -100.00 0.00 1
0.822279 6461 42 0 0.0 20567 -100.00 0.00 1
0.950085 6461 42 0 0.0 20566 -100.00 0.00 1
1.061797 6461 42 0 0.0 20567 -100.00 0.00 1
1.189510 6461 42 0 0.0 20568 -100.00 0.00 1