2014-09-01 23 views
3

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

现在我已经试过类似:

serial->setReadBufferSize(5000); 

现在这并成功地设置缓冲区的大小,我用serial->readBufferSize()确认是否它的工作与否。

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

  1. 设置缓冲区的大小(仅一次)
  2. 读串口
  3. 图中的数据
  4. 清除缓冲区(serial->明确的()) 。

重复步骤2 - 4

但这似乎并没有工作。

我正在利用QCustomPlot做实时绘图。

+2

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

回答

2

您可以以异步方式读取数据。只需将信号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 
    } 
} 
+0

你好Nejat,谢谢你的回应。为了解决我的问题,我最终做了类似于你的建议。我只是去if(serial-> size()> = 10000) serial-> clear(); 现在我的串行缓冲区每次都会清除。 – skandebaba 2014-09-25 03:48:08

0

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

serial.waitForReadyRead(50) 

50 ms适用于我。

相关问题