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

时间:2013-08-06 14:18:37

标签: c++ qt raspberry-pi qextserialport

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

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

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

我的架构是:

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

有两种情况:

  • 通过无线方式向Hub发送数据的卫星。在这种情况下,Pi每秒通过它的串口接收大量数据;
  • 卫星关闭,Pi通过串口每秒接收大约12个字节。

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

然而,当我打开卫星并且Pi开始接收大量数据时,这种“不同步”状态消失,有一阵数据(缓冲区增长得更快,之后被占用)并且我的程序开始“实时”工作。

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

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

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

1 个答案:

答案 0 :(得分:4)

你的问题是人们对QIODevice做的最常见的错误..你错误地认为每个字节都会调用readyRead,如果它像那样工作那么说会更完全错误。想法是,每次收到readyRead时都会有 SOMETHING 从设备中读取..它可以是1个字节,10个字节,1k ..等等。简单来说,它就是这样做的最小化在块传输的情况下CPU加载以及在硬件上以块为单位而不是以字节为单位读取数据。

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

您可能想查看here ..