c++ - QSerialPort - setReadBufferSize

标签 c++ qt serial-port

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

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

serial->setReadBufferSize(5000);

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

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

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

重复步骤 2 - 4。

但这似乎行不通。

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

最佳答案

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

关于c++ - QSerialPort - setReadBufferSize,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25597553/

相关文章:

c++ - long int v. long 的可读性

c++ - QSerialPort 仅在第二次打开后才能正确读取

c++运算符重载,

c - 将浮点变量中的逗号分隔字符串写入串行端口

c - 将串行数据重定向到以太网数据

serial-port - 从 Arduino 发送到 Processing 的奇怪随机数据

c++ - C++ 中的函数组合

multithreading - 在三个单独的QThread中绘制三个单独的QImage是否安全?

c++ - 我可以使用 applicationDirPath() 访问更高目录级别的资源吗?

c++ - 我可以简单地将 dll 库放到 Windows 文件夹中吗?