首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >readyRead() QextSerialPort (QIODevice)信号的调用速度不够快

readyRead() QextSerialPort (QIODevice)信号的调用速度不够快
EN

Stack Overflow用户
提问于 2013-08-06 14:18:37
回答 1查看 1.4K关注 0票数 2

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

这个连接到Pi的PanStamp执行两个函数:

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

我的建筑是:

  • Hub:PanStamp + Raspberry Pi;
  • 卫星:PanStamp +几个传感器。

有两种情况:

  • 卫星将数据传输到枢纽。在这种情况下,Pi每秒钟通过它的串口接收大量数据;
  • 卫星关闭,Pi接收大约12字节每秒通过串口。

当卫星关闭时,readyRead()信号不会在每次字节到达时产生,它会将我的程序驱动到“不同步”的状态,在这种情况下,对每个数据包读取一个或多个待在缓冲区中(持续增长)。

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

下面是我的程序输出的一个例子:Www.tiago.ate.br/storage/iSEDE.log

正如您在日志中看到的,可用的字节不断增加,数据每秒钟发送一次(以HUB:开头的行不是每秒钟处理一次)。在开头有一个时间戳)。过了一段时间,有一个突发(卫星已经打开)和有大量的数据被处理每秒钟,卫星的数据开始被处理(行开始从一个8),缓冲区是空的,我的程序开始处理数据的“实时”。

那么,我能做些什么来避免缓冲区增长过快而又不丢失数据呢?当缓冲区大于100个字节时,我试图调用连接到readyRead()的函数,但是它造成了混乱,我开始丢失一些数据包。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-08-06 19:44:18

你的问题是人们在使用QIODevice时最常见的错误。您错误地假设每个字节都调用了readyRead,说得更多--如果它那样工作,那将是完全错误的。这个想法是,每次你收到一个readyRead,就有一些东西可以从设备中读取。可以是1字节,10字节,1k。等等。简单地说,这样做是为了在块传输的情况下最小化CPU的负载,以及在硬件上以块而不是字节的形式读取数据。

因此,您应该做的是调用readAll()来获取到达的所有可用数据,并以您喜欢的方式处理这些数据。

你可能想看看这里..。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18082775

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档