【已解决】求佬指点:linux高频串口数据读取的问题

请问各位大佬,目前在做一个项目,需要读取100hz的数据,这个数据是从串口发送过来的,接收数据后需要打上时间戳,但是问题出现在,接受到串口数据之后,时间戳不准确,请问如何解决?

此外,我用minicom接收串口数据,也出现这样的问题,示例内容如下:

如图,数据理论时间戳应为20.303 20.313 20.323 20. 333, 但是实际读取的数据是四个数据一起进来的20.303 20.304 20.305 20.306。
用示波器看过波形,是100hz均匀间隔,请问各位大佬是什么问题呢?

4 个赞

图在哪佬友

1 个赞

已经更新了,麻烦大佬看一下

1 个赞

感谢大佬!

1 个赞

时间戳是minicom打上的吗?
试一下picocom
如果都不对,使用c O_DIRECT的方式open串口,然后把数据打出来看看

1 个赞

时间戳是minicom打上的,我试一下大佬说的!

1 个赞

minicom和picocom操作串口应该都是用的非O_DIRECT的方式,我猜想这样导致数据有一部分缓存,可能会导致这个问题。

看一下这个博客,如何添加时间戳

然后在这一行,open里面

改为

tty_fd = open(opts.port, O_RDWR | O_NONBLOCK | O_NOCTTY | O_DIRECT);

看一下,打印的会不会变好

1 个赞

或者minicom类似修改也可以。

这个做法不保证对,只是一个排除的方向 :joy:

好嘞!!!我试一下!!

好像| O_DIRECT没法用于串口通信 :sob:

猜想失败了 :sweat_smile:

是直接的串口 还是 usb转串口

看到了,usb转串口

是422转usb串口

没有思路了 :sweat_smile:,等大佬来帮忙吧

有试过楼上说的用picocom打时间戳吗?另外目前这个波特率是定死的吗

波特率是定死了的,试了一下picocom好像仍然是这个问题 :sob:

试了一下,好像不行 :fearful:

不懂帮顶

串口发送时虽然底层是按触发器方式处理,但实际读取时是放在一个buf池中。你上位机读的时候可能是直接读buf池那一堆,相当于同个时间点