我目前有一个问题。我正在尝试编写一个实时绘图程序。我从Arduino接收数据。我可以成功打开串行端口,正确读取信息并绘制图表。问题是,如果我不指定缓冲区大小,则假定输入缓冲区是无限的(现在以300Hz-4800Hz的速率读取数据,您可以想象您的计算机内存最终可能会填满,并且崩溃了!)。
现在我已经尝试过类似的东西:
serial->setReadBufferSize(5000);
现在,这确实成功设置了缓冲区大小,我使用了
serial->readBufferSize()
确认它是否起作用。问题是一旦缓冲区已满,程序将停止打印。现在我想我应该做的是:
重复步骤2-4。
但这似乎不起作用。
我正在使用
QCustomPlot
进行实时绘图。 最佳答案
您可以以异步方式读取数据。只需将readyRead()
的QSerialPort
信号连接到插槽即可。只要有新数据,就会发出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
}
}