热度 13
2023-4-10 11:49
2300 次阅读|
1 个评论
串口将接收到的数据,进行解析后,使用QT绘图,动态刷新显示。 先将项目文件中增加 charts 支持 QT += charts 在主窗口定义中增加 QT_CHARTS_USE_NAMESPACE 在 ui 中使用 graphic view 控件占用图形显示的位置,并将控件提升为 QChartView 控件。 Qchart 可以绘制折线、条形图或饼图。折线需要有 QLineSeries 容纳折线的坐标数据。 先定义私有成员 QLineSeries * LineSerial ; ,需要在构造函数中实例化。 chart = new QChart(); hide(); addSeries(LineSerial); //将线性序列加入到图 QValueAxis *xaxis = new QValueAxis(); //建立X,Y轴 QValueAxis *yaxis = new QValueAxis(); setRange(0,20); // 设定 数轴范围 setRange(0,10); addAxis(yaxis,Qt::AlignLeft); addAxis(xaxis,Qt::AlignBottom); attachAxis(xaxis); attachAxis(yaxis); setTitle("Simple line chart example"); //设定图的抬头 setChart(chart); // 将 图加入到chatview 这样就可以将折线图显示出来了。 使用串口数据动态刷新折线图 在串口接收的槽函数中,收到的数据是使用 readall() ,读到一个 QString 里面,但有可能只是零碎的数据片段。获得数据后,追加到先前接收到的数据后面,再进行处理。这里有一个专门的处理函数,在槽函数中调用。依据要求,传入数据段指针和需要处理的数据序列指针。使用 QString 中的各种方法,判断数据是不是完整的,找到数据头和尾。然后进行解析,将合法数据追加到数据序列里。 int bubfreqscanpharse(QString *p,QLineSeries *pls){ indexOf("@ 6.00 MHz"); int ret = 0; static int linecolor = 0; if(npos != -1){ right(2)=="\r\n"){ // QDebug() << "get tail"; split("@"); if(datlist.size()==42){ int i; float x,y; clear(); for(i=1;i<42;i++){ x = datlist .mid(1,4).toFloat(); y = datlist .mid(11,4).toFloat(); append(x,y); } setColor(QColor(qrand()%255,qrand()%255,qrand()%255)); ret = 1; } clear(); } } return ret; } 串口接收处理槽函数 void MainWindow::readData() { readAll(); // 串口收到的数据放到data中 append(data); // 追加data到接收缓冲区 setText(data); // 显示刚收到的数据 // 调用数据处理函数,并传入缓冲区数据和链接到图的数据序列指针 if(bubfreqscanpharse(buf,LineSerial) == 1){ createDefaultAxes(); } }