调用QextSerialPort(QIODevicece)的readyRead()信号的速度不够快
readyRead() signal of QextSerialPort (QIODevice) is not being called fast enough
我在树莓派上使用qextserialport与PanStamp(与Arduino兼容的设备)通信。
这个连接到Pi的PanStamp执行两个功能:
- 每秒发送一些传感器的读数(约12字节)
- 通过无线链路发送它接收到的所有数据(大约60字节,每秒大约6次)
我的架构是:
- 集线器:PanStamp+Raspberry Pi
- 卫星:PanStamp+一些传感器
有两种情况:
- 卫星正在向集线器无线发送数据。在这种情况下,圆周率每秒通过其串行端口接收大量数据
- 卫星关闭后,Pi每秒通过串行端口接收大约12个字节
当卫星关闭时,readyRead()
信号不会在每次字节到达时生成,它会将我的程序驱动到"不同步"状态,在这种状态下,读取的每个数据包都有一个或多个停留在缓冲区中(不断增长)。
然而,当我打开卫星,Pi开始接收大量数据时,这种"不同步"的情况消失了,出现了数据突发(缓冲区增长更快,之后被清空),我的程序开始"实时"工作。
以下是我的程序输出示例:www.tiago.eti.br/storage/iSDE.log
正如您在日志中看到的,可用的字节数不断增长,数据每秒发送一次(以HUB:
开头的行不是每秒处理一次的。开头有一个时间戳)。过了一段时间,出现了一个突发(卫星已经打开),每秒都有大量数据被处理,卫星的数据开始被处理(以8
开头的行),缓冲区被清空,我的程序开始"实时"处理数据。
那么,我该怎么做才能避免缓冲区增长过多,并且不会丢失数据呢?当缓冲区大于100字节时,我试图调用连接到readyRead()
的函数,但它造成了混乱,我开始丢失一些数据包。
你的问题是人们使用QIODevice。。你错误地认为readyRead是对每个字节调用的,说得更多的是,如果它这样工作,那就完全错误了。想法是,每次你收到readyRead时,都有东西要从设备中读取。。它可以是1字节、10字节、1k。。简单地说,它这样做是为了在块传输的情况下最小化CPU负载,以及在硬件上以块而不是以字节读取数据。
因此,您应该调用readAll()来获取所有到达的可用数据,并以您喜欢的方式对其进行处理。
你可能想看看这里。。
- 为什么在读取文件大小时文件IO速度会发生变化
- 为什么std::condition_variable notify_all的工作速度比notify_one快(对于随机请
- 文件系统:复制功能的速度秘诀是什么
- 学习多线程C++:添加线程不会使执行速度更快,即使它看起来应该
- 在C++中使用并行化的预期速度是多少(不是 OpenMp,而是 <thread>)
- 为什么程序员同时使用 std::bad_alloc 和 std::exception.是否 std::例外 仅是不够的
- 两个连续的 OpenMP 并行区域会相互减慢速度
- 查找标准::hash_map与标准::矢量的速度
- 加快在C++中读取/处理日志文件的速度
- 为什么这些算法的运行速度比它们应该的要快?
- 如何提高文件的读取速度?
- 通过libpqxx提高PostgreSQL数据库的更新速度
- 使用 IMFSinkWriter 编码的视频的播放速度会根据宽度而变化
- 计算车辆之间的距离并设置速度,使距离保持不变,例如 5 米
- 如何加快大字符串的解析速度?
- 如何比较两个函数的速度和性能
- 线程相互减慢速度
- 在鼠标按下时移动 SDL2 窗口的功能闪烁窗口并且移动速度不够快
- 写入位集的速度不够快
- 调用QextSerialPort(QIODevicece)的readyRead()信号的速度不够快