gpt4 book ai didi

c++ - QextSerialPort (QIODevice) 的 readyRead() 信号调用速度不够快

转载 作者:搜寻专家 更新时间:2023-10-31 01:08:22 26 4
gpt4 key购买 nike

我在 Raspberry Pi 上使用 qextserialport 与 PanStamp(Arduino 兼容设备)通信。

这个连接到 Pi 的 PanStamp 执行两个功能:

  • 每秒发送一些传感器的读数(大约 12 个字节);
  • 通过无线链路发送它接收到的所有数据(大约每秒 6 次,大约 60 字节)。

我的架构是:

  • 集线器:PanStamp + Raspberry Pi;
  • 卫星:PanStamp + 一些传感器。

有两种情况:

  • 关于向集线器无线发送数据的卫星。在这种情况下,Pi 每秒通过其串口接收大量数据;
  • 卫星关闭,树莓派每秒通过串口接收大约 12 个字节。

当卫星关闭时,readyRead() 信号不会在每次到达一个字节时生成,它会使我的程序进入“不同步”状态,每个数据包读取一个或多个留在缓冲区中(不断增长)。

然而,当我打开卫星并且 Pi 开始接收大量数据时,这种“不同步”情况消失了,出现了数据突发(缓冲区增长得更快,之后被清空)并且我的程序开始“实时”工作。

这是我的程序输出的示例:www.tiago.eti.br/storage/iSEDE.log

正如您在日志中看到的,可用字节不断增长,数据每秒发送一次(以 HUB: 开头的行并不是每秒都在处理。开头有一个时间戳) .过了一会儿有一个突发(卫星已经打开)并且每秒有很多数据被处理,卫星的数据开始被处理(以 8 开头的行),缓冲区是清空,我的程序开始“实时”处理数据。

那么我该怎么做才能避免缓冲区增长太多并且不丢失数据呢?当缓冲区大于 100 字节时,我尝试调用连接到 readyRead() 的函数,但它造成了困惑,我开始丢失一些数据包。

最佳答案

你的问题是人们在使用 QIODevice 时最常犯的错误。你错误地认为 readyRead 在每个字节上都被调用,如果它这样工作的话,那就完全错了。想法是,每次您收到 readyRead 时,都有 SOMETHING 可以从设备读取。它可以是 1 字节、10 字节、1k 等。简而言之,这样做是为了最小化 block 传输情况下的 CPU 加载以及在硬件上以 block 而不是字节读取数据。

所以你应该做的是调用 readAll() 来获取所有到达的可用数据并以你喜欢的方式处理它们。

你可能想看看 here ..

关于c++ - QextSerialPort (QIODevice) 的 readyRead() 信号调用速度不够快,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18082775/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com