1

我需要帮助。这是我的代码(我显示主要部分):

// Arduino Reader

    serial.setPortName("/dev/ttyACM0");
    serial.open(QIODevice::ReadWrite);
    serial.setBaudRate(QSerialPort::Baud9600);
    serial.setDataBits(QSerialPort::Data8);
    serial.setParity(QSerialPort::NoParity);
    serial.setStopBits(QSerialPort::OneStop);
    serial.setFlowControl(QSerialPort::NoFlowControl);
    connect(&serial,SIGNAL(readyRead()),this,SLOT(getNewData()));

...

void MainWindow::getNewData()
{
    std::clock_t starter = std::clock();
    QByteArray data = serial.readAll();
    QDataStream in(serial.readAll());
    getData = getData + data;

    int start = getData.indexOf(":START:");
    int end = getData.indexOf(":END:",start);
    QString nowWork = getData.mid(start,end-start+5);
    if (nowWork.startsWith(":START:") && nowWork.endsWith(":END:")){
        QStringList mod = nowWork.remove(":START:").remove(":END:").split(":");
        int xPoint = mod[0].toInt();
        int yPoint = mod[1].toInt();
        int zPoint = mod[2].toInt();
        int aPoint = mod[3].toInt();
        int bPoint = mod[4].toInt();
        int cPoint = mod[5].toInt();
        addQuery(1,xPoint,yPoint,zPoint);
        addQuery(2,aPoint,bPoint,cPoint);
        getData = getData.right(end+5);
    }
    std::clock_t ender = std::clock();
    ui->ping->setText(QString::number( (ender-starter)/ (double)CLOCKS_PER_SEC *100));
    return;
}

...

 void MainWindow::addQuery(int to, int x, int y, int z){
        seriesAllD1->append(now, (x+y+z)/3 );
        seriesXD1->append(now,x);
        seriesYD1->append(now,y);
        seriesZD1->append(now,z);
        seriesAllD1->remove(0);
        seriesXD1->remove(0);
        seriesYD1->remove(0);
        seriesZD1->remove(0);
        chartAllD1->axisX()->setRange(now-100,now);
        chartX->axisX()->setRange(now-100,now);
        chartY->axisX()->setRange(now-100,now);
        chartZ->axisX()->setRange(now-100,now);
        now++;
        return;
    }

我尝试描述代码:1)它从arduino获取数据(如“:START:X:Y:Z:A:B:C:END::START:...”)。2) 它从 2 传感器(3 轴加速度计)获得指示。并绘制图表。

我展示了一些代码块。添加〜900点后,它从60毫秒变慢到1000毫秒。我认为它与 QtChart 相关(我在项目中使用它们)或添加点到系列。请帮我(

4

1 回答 1

0

这是一个古老的话题 - 但是我在使用 QtCharts 时也遇到了它 - 所以:对于那些会偶然发现 QtCharts 相同问题并且也想使用 QtCharts 的其他人,这是我的解决方案:

使用 OpenGL:

  • 在图中的系列上调用setUseOpenGL(true)(仅适用于 QLineSeries 和 QScatterSeries) - 不幸的是,这不是默认设置,但在某些系统上可能会出现问题

不使用 OpenGL 时(即也使用 QAreaSeries):

一位同事在处理实时数据时想出了这个特殊技巧:

  • 将所有系列设置为signalsBlocked(true),阻塞时启动计时器,一秒钟后解除阻塞,再次阻塞并在再次添加新数据时启动计时器 - 这将每秒更新一次图,但性能影响很低
于 2020-08-05T05:18:36.693 回答