一.前言
- 闲了好久没更新博客,偷懒的我就拿了去年暑假备战电赛时做的一个串口版“示波器”来充充水。抛砖引玉哈。
- 因为以前发过一篇主题一样的文章,所以就当该文就相当于上版的升级版(其实两者没啥关系,仅是主题一样,以前那篇是单纯为赛题弄的,这篇更有通用性)
- 是当时为电赛准备的(吐槽一下,原本我组准备的电源题,怎么想着也会用上adc、pwm啥的吧,结果19年的A题一出来真是让我一言难尽啊)
- 实现的功能有:自定义数据格式,多个数据图线显示,自动和手动两种模式,显示鼠标当前的位置
- 因为时间有点久,很多注释没写到还请谅解。
二.效果介绍
- 因为一直宅在家,又没带板子回来,所以就只能看看界面了,红色字体为说明
![在这里插入图片描述](https://img-blog.csdnimg.cn/20200216185502604.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2FwcGxlXzIzMzM=,size_16,color_FFFFFF,t_70)
三.软件思路介绍
- 大概思路,串口接收数据,然后按照自定义格式解析数据,最后绘画波形图,因为总代码有点多,就不全贴出来,有空我上传到github上去,也可以评论发邮箱号我来发给你。
- 这里用到到绘画波形图的库是qcustomplot,不清楚的可以百度一下,它的官网介绍得挺详细的。
- 先是定义一个Handle类里有串口的自动检测,即如果检测有串口出现会自动加到串口端口的栏中,和串口数据的接收、数据解析和曲线图的绘画(放在一个线程里执行,防止界面显示卡死)代码如下,先是头文件:
#include <QObject>
#include <QtSerialPort/QSerialPort>
#include <QtSerialPort/QSerialPortInfo>
#include "qcustomplot.h"
#include <QVector>
#define MAX_COUNT 1500
#define cout qDebug() << __LINE__ << ":"
class Handle : public QObject
{
Q_OBJECT
public:
explicit Handle(QCustomPlot *P,QObject *parent = nullptr);
signals:
void finish();
public slots:
void getValidPort(QComboBox* p);
void getText(QString t);
void analyData();
void setFlag(QString b = "[",QString m=",",QString e="]"){
begin = b;mid = m; end = e;
}
void clear();
void setAuto(bool e){
isAuto = e;
}
void setRun(bool e){
isRun = e;
}
void setOpen(bool e){
isPortOpen = e;
}
bool getOpen(){
return isPortOpen;}
bool getRun(){
return isRun;}
bool getAuto(){
return isAuto;}
private:
QString begin,mid,end;
QString text;
bool isPortOpen;
QStringList list;
QCustomPlot *Plot;
QVector <QCPItemTracer *> trace;
QVector <QCPItemText * > Ptext;
QVector <QVector<double>> YData;
QVector <double> XData;
QVector<QPen> pen;
int Clk,xMid;
int countLine;
int firstLine;
bool isAuto,isRun;
};
- 再贴点串口数据解析函数的代码
void Handle::analyData()
{
int _end = text.indexOf(begin);
text.remove(0,_end+1);