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

现在我已经尝试过类似的东西:

serial->setReadBufferSize(5000);

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

问题是一旦缓冲区已满,程序将停止打印。现在我想我应该做的是:
  • 设置缓冲区大小(仅一次)
  • 读取串口
  • 绘制数据
  • 清除缓冲区(serial-> clear())。

  • 重复步骤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
        }
    }
    

    10-06 01:54