【问题标题】:QSerialPort continuous reading accumulative delayQSerialPort 连续读取累积延迟
【发布时间】:2019-11-07 17:22:42
【问题描述】:

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

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

我尝试了什么:

QSerialPort serialPort; 是我的设备端口

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

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

这是我的代码 sn-p:

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

Rec() 是我做通信部分的函数。

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
}

我在这个问题上纠结了很长时间。上面的代码 sn-p 是我认为必要的,但如果有人需要更多说明,我可能会透露更多代码。

【问题讨论】:

  • 目前串口速度是多少?能否跟上:"...字符串长度很大,大约 300 [无单位]..." 数据量?
  • 将它减少到 100 字符长,我猜对于 18400 的波特率来说这并不长,仍然不起作用。
  • 好的,当我提高波特率时,延迟会显着减少,但累积的延迟会在很长一段时间后反映出来。

标签: c++ qt arduino


【解决方案1】:

我也遇到了同样的问题,是的 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() 似乎工作。

【讨论】:

  • 会检查一下是否有累积延迟。
  • 因为可能 readAll() 等待传入的字节,而 clear() 只清除接收缓冲区?
猜你喜欢
  • 2012-04-12
  • 1970-01-01
  • 2014-05-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-01
  • 2018-01-04
相关资源
最近更新 更多