QSerialPort连续读取累积延迟

QSerialPort continuous reading accumulative delay

本文关键字:延迟 读取 连续 QSerialPort      更新时间:2023-10-16

我正在尝试从QT应用程序到Arduino进行通信。流程是这样的:QT应用程序发送一个"1",Arduino预计会用一些数据响应(数据字符串长度很大,大约为300(。QT应用程序以大约5Hz(每200ms(的速率发送"1"。

我面临的问题是,在Arduino到QT的通信之间存在累积延迟。也就是说,我从Arduino收到的数据不是最近的数据,但Arduino的数据频率仅为5Hz(正如预期的那样(,只是来的数据不是最新的。这种延迟随着时间的推移而不断增加。我认为缓冲区或其他方面有问题。

我尝试过的:

QSerialPort serialPort;是我的设备端口

  1. serialPort.clear()
  2. serialPort.flush()
  3. 从两端增加和减少波特率
  4. 从Arduino减少字符长度,这里的延迟显著减少,但在长时间后会观察到累积的延迟

以清除串行通信缓冲区,但问题仍然存在。

这是我的代码片段:

connect(timer_getdat, SIGNAL(timeout()), this, SLOT(Rec()));
timer_getdat->start(200); 

其中CCD_ 4是我做通信部分的函数。

Rec():中

serialPort.write("1", 2);
//            serialPort.waitForBytesWritten(100);
long long bytes_available = serialPort.bytesAvailable();
if (bytes_available >= 1)
{
serialPort.readLine(temp, 500);
serialPort.flush(); // no change
serialPort.clear(); // no change by .clear() also
}

我在这个问题上纠缠了很长时间。上面的代码片段是我认为必要的,但如果有人需要更多的澄清,我可能会透露更多的代码。

我也遇到了同样的问题,是的,QSerialPort.clear()QSerialPort.flush()没有帮助。尝试执行readAll()

因此,将Rec((函数中的部分更改为以下内容:

serialPort.write("1", 2);
long long bytes_available = serialPort.bytesAvailable();
if (bytes_available >= 1)
{
serialPort.readLine(temp, 500);
serialPort.readAll(); // This reads all the data in buffer at once and clears the queue.
}

即使在QT论坛上,我也没有找到答案,只是在玩QSerialPort类和readAll((的所有可用函数。

关于readAll(),Qt文档中写道:

从设备读取所有剩余数据,并将其作为字节返回大堆

我对分辨率的解释是readAll从通信缓冲区捕获所有数据并清空它。

这应该是clear()功能的工作,但显然readAll()似乎起作用了。