Qt qextserial进行串口数据采集,qcustomplot进行绘图,曲线实时显示横纵坐标辅助线
Qt qextserial进行串口数据采集,qcustomplot进行绘图,曲线实时显示横纵坐标辅助线
目的、要求:
A.读取RS422接口接收到的全部数据;
1.通过接口读取板卡采集的数据,采用多线程,读取数据和解析数据在主线程,绘制曲线在另一个新的线程。COM和API接口见附件1.板卡用户手册。
2.根据接收到的数据,需要先判定是返参帧A还是返参帧B,每一帧具有27个字节,每帧依据“帧头”和“校验和”来判定。
需要注意:
a)数据流起始位置并不一定是“帧头”。
b)数据流中可能存在无效的数据包,需要注意判定逻辑,以免丢失有效数据。
B.能够依据协议对数据进行解析并存储;
1.要求对返参帧A和返参帧B数据分别解析,详细的解析与处理要求见附件2。附件2中需要用到的解析协议见附件3。
2.将接收到的返参帧A和返参帧B分别存储在文档不同的sheet中,文档格式为".xlsx",允许用户在软件界面上以点击按钮的形式选择数据存储开始/结束,允许用户选择设置路径。
3.存储内容包括附件2表中全部解析内容,每一项解析内容对应存储在文档中一列,存储数据为解析后未经数据处理的数据。
C.对解析后的一些数据,以曲线的形式显示。
1.软件需对返参帧A和返参帧B的部分解析内容进行实时曲线绘制,需要绘制曲线的参数见附件4。共15个曲线图。
2.通过“选项卡”的形式将不同类型曲线放置在不同选项卡页面中。
3.要求曲线能根据接收解析后的数据点进行动态实时更新,从右向左,横坐标代表点的个数,曲线对应的横坐标刻度要一同向左更新移动。
4.要求曲线窗口有图标题,有横纵坐标标题;如果一个曲线窗口中有多条曲线,要求用不同颜色区分,对不同曲线有标注;用户可选择仅显示其中某一条或某两条曲线;
5.曲线要求正常显示为1000个数据点,缓存区要求存180000个数据点,可在曲线窗口上左右拖拽以查看180000中的各个1000个数据点的显示区间,超出180000个数据点缓存区后,每进入一个新的数据点,则顺次清除一个原数据点。曲线横、纵坐标范围允许用户调整,可进行2、4、6、8倍的4档放大曲线局部判读。
6.鼠标移动到曲线上的数据点上时,要求有指向横、纵坐标的辅助线。
简介:
考虑到这个要移植到硬件上,到时候交叉编译后的Qt环境需要串口模块的支持。所以选用了第三方的chua串口通讯模块qextserial进行串口通讯。绘图使用的第三方的qcustomplot。串口模块放到线程里,数据处理和绘图部分放到了主线程。这个地方主要麻烦的是对通讯帧的解析。首先分为A B两种mo's模式,每个字节对应的有不同的含义。有些字节的某几位对应的不同的含义。剩下的就是数据的辅助线问题了。辅助线继承了QCustomPlot,然后重写了鼠标事件和其他的一些事件。
效果:
代码:
#ifndef MHCUSTOMPLOT_H
#define MHCUSTOMPLOT_H#include "mhtracer.h"
#include "qcustomplot.h"
#include <QObject>
#include <QList>class MhCustomPlot : public QCustomPlot
{Q_OBJECT
public:MhCustomPlot(QWidget *parent = 0);protected:virtual void mouseMoveEvent(QMouseEvent *event);virtual void enterEvent(QEvent *event);virtual void leaveEvent(QEvent *event);//virtual void mouseDoubleClickEvent(QMouseEvent *event);
//signals://void legendDoubleClickChilden(QCPLegend *legend, QCPAbstractLegendItem *item, QMouseEvent *event);
public://设置是否显示鼠标追踪器//是否显示void showTracer(bool show);// 是否显示鼠标追踪器bool isShowTracer(){return m_isShowTracer;}private:bool m_isShowTracer;//是否显示追踪器(鼠标在图中移动,显示对应的值)MhTracer *m_xTracer;//x轴MhTracer *m_yTracer;//y轴QList<MhTracer *> m_dataTracers;//MhTraceLine *m_lineTracer;//直线
};#endif // MHCUSTOMPLOT_H
#include "mhcustomplot.h"MhCustomPlot::MhCustomPlot(QWidget *parent):QCustomPlot(parent),m_isShowTracer(false),m_xTracer(Q_NULLPTR),m_yTracer(Q_NULLPTR),m_dataTracers(QList<MhTracer *>()),m_lineTracer(Q_NULLPTR)
{}
//设置是否显示鼠标追踪器
//是否显示
void MhCustomPlot::showTracer(bool show)
{m_isShowTracer = show;if(m_xTracer)m_xTracer->setVisible(m_isShowTracer);///if(m_yTracer){m_yTracer->setVisible(m_isShowTracer);}foreach (MhTracer *tracer, m_dataTracers){if(tracer)tracer->setVisible(m_isShowTracer);}if(m_lineTracer)m_lineTracer->setVisible(m_isShowTracer);
}void MhCustomPlot::mouseMoveEvent(QMouseEvent *event)
{QCustomPlot::mouseMoveEvent(event);if(m_isShowTracer){//当前鼠标位置(像素坐标)int x_pos = event->pos().x();int y_pos = event->pos().y();//qDebug() << "x_pos:" << x_pos << "y_pos:" << y_pos;//像素坐标转成实际的x,y轴的坐标float x_val = this->xAxis->pixelToCoord(x_pos);float y_val = this->yAxis->pixelToCoord(y_pos);if(Q_NULLPTR == m_xTracer)m_xTracer = new MhTracer(this, MhTracer::XAxisTracer);//x轴m_xTracer->updatePosition(x_val, y_val);if(Q_NULLPTR == m_yTracer)m_yTracer = new MhTracer(this, MhTracer::YAxisTracer);//y轴m_yTracer->updatePosition(x_val, y_val);int nTracerCount = m_dataTracers.count();int nGraphCount = graphCount();if(nTracerCount < nGraphCount){for(int i = nTracerCount; i < nGraphCount; ++i){MhTracer *tracer = new MhTracer(this, MhTracer::DataTracer);m_dataTracers.append(tracer);}}else if(nTracerCount > nGraphCount){for(int i = nGraphCount; i < nTracerCount; ++i){MhTracer *tracer = m_dataTracers[i];if(tracer){tracer->setVisible(false);}}}for (int i = 0; i < nGraphCount; ++i){MhTracer *tracer = m_dataTracers[i];if(!tracer)tracer = new MhTracer(this, MhTracer::DataTracer);tracer->setVisible(true);tracer->setPen(this->graph(i)->pen());tracer->setBrush(Qt::NoBrush);tracer->setLabelPen(this->graph(i)->pen());auto iter = this->graph(i)->data()->findBegin(x_val);double value = iter->mainValue();
// double value = this->graph(i)->data()->findBegin(x_val)->value;tracer->updatePosition(x_val, value);}if(Q_NULLPTR == m_lineTracer)m_lineTracer = new MhTraceLine(this,MhTraceLine::Both);//直线m_lineTracer->updatePosition(x_val, y_val);this->replot(QCustomPlot::rpQueuedReplot);//曲线重绘}
}void MhCustomPlot::enterEvent(QEvent *event)
{//QCustomPlot::enterEvent(event);//qDebug() << "鼠标进入";m_isShowTracer = true;if(m_xTracer)m_xTracer->setVisible(m_isShowTracer);if(m_yTracer){m_yTracer->setVisible(m_isShowTracer);}foreach (MhTracer *tracer, m_dataTracers){if(tracer)tracer->setVisible(m_isShowTracer);}if(m_lineTracer)m_lineTracer->setVisible(m_isShowTracer);this->replot(QCustomPlot::rpQueuedReplot);
}void MhCustomPlot::leaveEvent(QEvent *event)
{//QCustomPlot::leaveEvent(event);//qDebug() << "鼠标离开";m_isShowTracer = false;if(m_xTracer)m_xTracer->setVisible(m_isShowTracer);if(m_yTracer){m_yTracer->setVisible(m_isShowTracer);}foreach (MhTracer *tracer, m_dataTracers){if(tracer)tracer->setVisible(m_isShowTracer);}if(m_lineTracer)m_lineTracer->setVisible(m_isShowTracer);this->replot(QCustomPlot::rpQueuedReplot);
}//void MhCustomPlot::mouseDoubleClickEvent(QMouseEvent *event)
//{
// QCustomPlot::mouseDoubleClickEvent(event);
//}
exe地址(百度网盘链接):
链接:https://pan.baidu.com/s/1YeYbY32FM1Ol1FKvdLUUJA
提取码:tr0d
QQ:921673516 QQ群:511450936 邮箱:yue_xusy@163.com
Qt qextserial进行串口数据采集,qcustomplot进行绘图,曲线实时显示横纵坐标辅助线相关推荐
- Qt 串口数据采集并绘图
VX:13225601016 获取源码和数据集 github:GitHub - supershifeiyu/serial_test: Qt串口数据采集并实时绘图 serial_test.p ...
- android 串口一直打开_实例 | 使用Python串口实时显示数据并绘图
今天为大家分享一篇使用Python串口实时显示数据并绘图的例子,具有很好的参考价值,希望对大家有所帮助. 一.安装pyserial以及基本用法 使用pyserial进行串口传输,在cmd下输入命令pi ...
- python串口数据绘图_使用Python串口实时显示数据并绘图的例子
使用pyserial进行串口传输 一.安装pyserial以及基本用法 在cmd下输入命令pip install pyserial 注:升级pip后会出现 "'E:\Anaconda3\Sc ...
- python中texttable库显示实时数据_用Python串口实时显示数据并绘图pyqtgraph
用Python串口实时显示数据并绘图 使用pyserial进行串口传输 一.安装pyserial以及基本用法 在cmd下输入命令pip install pyserial 注:升级pip后会出现 &qu ...
- 用Python串口实时显示数据并绘图pyqtgraph(详细教程)
用Python串口实时显示数据并绘图 使用pyserial进行串口传输 一.安装pyserial以及基本用法 在cmd下输入命令pip install pyserial 注:升级pip后会出现 &qu ...
- python读取串口数据 绘图_使用Python串口实时显示数据并绘图的例子
使用pyserial进行串口传输 一.安装pyserial以及基本用法 在cmd下输入命令pip install pyserial 注:升级pip后会出现 "'E:Anaconda3Scri ...
- 【 Qt编写一个串口助手】
Qt编写一个串口助手 一.初始化 初始化需要注意的是,需要用到关于图形的qcustomplot 库,添加相关的.h和.cpp文件并在.pro文件下加上greaterThan(QT_MAJOR_VERS ...
- labview串口数据采集并显示_一种NB-IoT冶金节点温度采集与远程监测系统的设计...
大型高炉出铁量大,冶金生产环境恶劣,导致铁水沟侵蚀日益严重,需人工定期对冶金沟道部分进行温测,其准确度不高,生产成本高,安全保障低[1].为了能够对高炉冶金沟道进行全方位测温,掌握铁水沟道的温度和腐蚀 ...
- 树莓派 Raspberry Pi 3B+ 无线路由器, WEB 服务器(Nginx,PHP,Sqlite3),UART 串口数据采集
目标: 测试四核 A53 树莓派 Raspberry Pi 3B+ 无线路由器, 轻量级WEB 服务器(Nginx,PHP,Sqlite3),UART 串口数据采集性能 初始配置,部分选项需要sudo ...
最新文章
- 编写高质量代码改善C#程序的157个建议——建议87:区分WPF和WinForm的线程模型...
- 武汉锅检所检测机器人_嵊州市管道cctv机器人-检测服务,武汉天仪ty333,诚信承诺...
- 调多大的角度 计算几何
- 自定义C++一元多项式类
- php 特有,PHP单一入口的特有作用
- asp连oracle测试,ASP连接Oracle
- OSPF——多区域概念及配置、ABR简介、ASBR简介、路由重分发
- 20190819:(leetcode习题)字符串中的第一个唯一字符
- android中的weight
- 802.1D生成树STP协议
- 分布式文件存储FastDFS之安装Nginx实现文件访问
- 面试题——内网相关(一)
- JAVA调用WebService的三种方法
- Excel 数据透视表教程大全之 01 什么是数据透视表 如何创建数据透视表
- springboot整合mybatis拦截器分页
- 使用ADO控件连接“文件DSN”
- win10系统双屏如何设置不同的桌面
- 运放选型、参数分析以及应用
- flex布局和响应式布局
- CentOS8部署多版本共存Python开发环境
热门文章
- 如何使用VS Code创建vue项目
- 【python 获取时间】
- pythonturtle库函数详解_Python turtle库详解
- Android Camera生成bmp格式的图片
- Linux动态查看时间
- FreeNas_11.3安装指导
- 计算机考研真实情况,上海交通大学计算机考研经验:把握最真实的自己,深刻地解读自己...
- Python二维列表创建DataFrame
- 7.12. 溯源分析
- linux 动态连接原理,Linux动态连接原理 GOT PLT表详解