我在Raspberry Pi上使用qextserialport与PanStamp(Arduino兼容设备)进行通信。
连接到Pi的PanStamp执行两个功能:
我的架构是:
有两种情况:
当卫星关闭时,每次一个字节到达时都不会生成readyRead()
信号,它会将我的程序驱动到“不同步”状态,每个数据包都会读取缓冲区中的一个或多个数据包(不断增长。)
然而,当我打开卫星并且Pi开始接收大量数据时,这种“不同步”状态消失,有一阵数据(缓冲区增长得更快,之后被占用)并且我的程序开始“实时”工作。
以下是我的程序输出示例:www.tiago.eti.br/storage/iSEDE.log
正如您在日志中看到的那样,可用字节不断增长,每秒发送数据(以HUB:
开头的行每秒都没有处理。开头有一个时间戳)。过了一会儿,有一个爆发(卫星已经打开),每秒都有大量的数据被处理,卫星的数据开始被处理(以8
开头的行),缓冲区被清空,我的程序开始“实时”处理数据。
那么我该怎么做才能避免缓冲区增长过多而不丢失数据呢?
当缓冲区大于100字节时,我试图调用连接到readyRead()
的函数,但它造成了一团糟,我开始丢失一些数据包。
答案 0 :(得分:4)
你的问题是人们对QIODevice做的最常见的错误..你错误地认为每个字节都会调用readyRead,如果它像那样工作那么说会更完全错误。想法是,每次收到readyRead时都会有 SOMETHING 从设备中读取..它可以是1个字节,10个字节,1k ..等等。简单来说,它就是这样做的最小化在块传输的情况下CPU加载以及在硬件上以块为单位而不是以字节为单位读取数据。
所以你应该做的是调用readAll()来获取所有可用的数据并以你喜欢的方式处理它们。
您可能想查看here ..