我使用Raspberry上的qextserialport与PanStamp (Arduino兼容设备)通信。
这个连接到Pi的PanStamp执行两个函数:
我的建筑是:
有两种情况:
当卫星关闭时,readyRead()
信号不会在每次字节到达时产生,它会将我的程序驱动到“不同步”的状态,在这种情况下,对每个数据包读取一个或多个待在缓冲区中(持续增长)。
然而,当我打开卫星,Pi开始接收大量数据--这种“不同步”的状态消失了,就会出现数据突发(缓冲区增长更快,然后被清空),而我的程序开始“实时”工作。
下面是我的程序输出的一个例子:Www.tiago.ate.br/storage/iSEDE.log
正如您在日志中看到的,可用的字节不断增加,数据每秒钟发送一次(以HUB:
开头的行不是每秒钟处理一次)。在开头有一个时间戳)。过了一段时间,有一个突发(卫星已经打开)和有大量的数据被处理每秒钟,卫星的数据开始被处理(行开始从一个8
),缓冲区是空的,我的程序开始处理数据的“实时”。
那么,我能做些什么来避免缓冲区增长过快而又不丢失数据呢?当缓冲区大于100个字节时,我试图调用连接到readyRead()
的函数,但是它造成了混乱,我开始丢失一些数据包。
发布于 2013-08-06 19:44:18
你的问题是人们在使用QIODevice时最常见的错误。您错误地假设每个字节都调用了readyRead,说得更多--如果它那样工作,那将是完全错误的。这个想法是,每次你收到一个readyRead,就有一些东西可以从设备中读取。可以是1字节,10字节,1k。等等。简单地说,这样做是为了在块传输的情况下最小化CPU的负载,以及在硬件上以块而不是字节的形式读取数据。
因此,您应该做的是调用readAll()来获取到达的所有可用数据,并以您喜欢的方式处理这些数据。
你可能想看看这里..。
https://stackoverflow.com/questions/18082775
复制相似问题