QSerialPort - setReadBufferSize

3
我目前遇到了一个问题。我正试图编写一个实时绘图程序,需要从Arduino接收数据。我可以成功地打开串口并正确读取信息并绘制图形。问题是,如果我不指定缓冲区大小,则输入缓冲区被认为是无限的(现在以300Hz-4800Hz的速率读取数据,你可以想象你的电脑内存最终可能会填满,导致一切崩溃!)。
现在我尝试过类似这样的东西:
serial->setReadBufferSize(5000);

现在,这确实成功设置了缓冲区大小。我使用serial->readBufferSize()确认它是否起作用。
问题是,一旦缓冲区已满,程序就停止绘图。现在我想做的是:
1.设置缓冲区大小(只需一次) 2.读取串口 3.绘制数据 4.清空缓冲区(serial->clear())。
重复步骤2-4。
但是这似乎不起作用。
我正在使用QCustomPlot进行实时绘图。

2
读取串行数据会将其从缓冲区中删除。我不明白你的问题所在。如果你读取数据的速度比接收速度快,缓冲区就不应该填满。如果没有这种情况,请使用RS232流控制。为什么要清除缓冲区?那只会丢失数据。 - Martin James
2个回答

3

您可以以异步方式读取数据。只需将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();现在我的串行缓冲区每次都会清空。 - skandebaba

-1

请确保您的serial.waitForReadyRead不是非常小。

serial.waitForReadyRead(50)

50 毫秒对我来说可行。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接