【问题标题】:QSerialPort - setReadBufferSizeQSerialPort - setReadBufferSize
【发布时间】:2017-09-27 21:02:44
【问题描述】:

我目前有一个问题。我正在尝试编写一个实时绘图程序。我从 Arduino 接收数据。我可以成功打开串口并正确读取信息并绘制图表。问题是,如果我不指定缓冲区大小,则假定输入缓冲区是无限的(现在以 300Hz-4800Hz 读取数据,您可以想象您的计算机内存最终可能会填满,一切都崩溃了!)。

现在我尝试了类似的方法:

serial->setReadBufferSize(5000);

现在这确实成功设置了缓冲区大小,我使用serial->readBufferSize() 确认它是否有效。

问题是一旦缓冲区满了,程序就会停止绘图。现在我想我应该做的是:

  1. 设置缓冲区大小(仅一次)
  2. 读取串口
  3. 绘制数据
  4. 清除缓冲区 (serial->clear())。

重复步骤 2 - 4。

但这似乎不起作用。

我正在使用QCustomPlot 进行实时绘图。

【问题讨论】:

  • 读取串行数据会将其从缓冲区中删除。我不明白你的问题。如果您读取数据的速度快于接收数据的速度,则缓冲区不应填满。如果不是,请使用 RS232 流量控制。为什么要清除缓冲区?那只会丢弃数据。

标签: c++ qt serial-port


【解决方案1】:

您可以以异步方式读取数据。只需将QSerialPortreadyRead() 信号连接到插槽即可。只要有新数据可用,就会发出readyRead()

connect(&serial, SIGNAL(readyRead()), this, SLOT(readData()));

readData() 是每次QSerialPort 发出readyRead() 信号时调用的槽。 readData() 将任何可用数据附加到 QByteArray 类成员。您可以在此插槽中检查是否接收到特定数量的数据:

void MyClass::readData()
{
    receivedData.append(serial.readAll());

    if(receivedData.count()>=5000)
    {
        //Plot data and remove plotted data from receivedData
    }
}

【讨论】:

  • 您好 Nejat,感谢您的回复。为了解决我的问题,我最终做了类似于你建议的事情。我只是去 if (serial->size() >= 10000) serial->clear();现在我的串行缓冲区每次都会清除。
【解决方案2】:

确保您的 serial.waitForReadyRead 不是很小。

serial.waitForReadyRead(50)

50 毫秒适合我。

【讨论】:

    猜你喜欢
    • 2017-06-02
    • 1970-01-01
    • 2017-11-06
    • 1970-01-01
    • 2023-03-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多