Serial Scope——基于QCustomPlot的串口虚拟示波器开发过程

周末撸了一个串口虚拟示波器,之前用别人开发的经常有bug,而且也不灵活,没有源码什么都改不了,所以决定用一个周末自己开发一个来玩玩,在这个博客里记录一下开发过程,由于之前没玩过QT,写的有些不当的地方烦请指出。

一、需求分析

  1. 通过串口接收数据,要能同时传输10个通道的数据;
  2. 10个通道的数据都能实时显示波形曲线,可以打开或关闭任意通道;
  3. 软件启动后,会自动搜索可用的串口;波特率至少要能满足9600bps、115200bps;默认数据位为8,.无校验位,停止位为1;
  4. 示波器可以通过暂停键来停止波形的更新;
  5. 示波器Y轴可以自动缩放,也可以关闭自动缩放功能;
  6. 可以通过鼠标左键上下左右拖动波形,可以通过鼠标滚轮放大缩小波形,也可以通过右键框选波形进行局部放大;
  7. 可以选择X轴每页显示的点数,即选择波形移动的速度;
  8. 在软件界面的选择和配置在关闭软件时可以保存,下次打开软件自动加载这些配置;
  9. 波形数据可以保存,可以分别保存成图片格式或数据保存到文本文件中;

二、方案设计

软件运行平台主要是windows10,所以刚开始考虑使用C#或者QT,C#相关的图形库比较少,也不能跨平台,所以选择QT。看了几篇帖子,发现QCustomPlot这个QT的开源图形库,小巧简洁,开发起来比较容易,于是去官网下载了QCustomPlot.tar.gz这个包,安装了Qt5.12.11,用Qt Creator作为开发环境。在QCustomPlot.tar.gz压缩包中有几个例子,每个例子都运行看了一下发现有个动态实时数据Plot的例程(如下图),就决定基于这个例程进行修改。
在这里插入图片描述

三、开发过程

1. 串口收发数据

首先写一个简单界面(如下图)实现串口收发数据,这个时候需要写一个串口接收界面,互相收发,后面测试也可以用到。串口收发数据很容易,网上教程也很多,比较难搞的是触发ReadData()的信号槽并不是一帧数据触发一次,而是一有数据就会触发,这就导致每次调用readAll()函数读到的数据长度是变化的,这就导致解析通信协议的时候需要做更多的逻辑处理。
在这里插入图片描述

2. 动态曲线

利用QCustomPlot提供的接口实现动态曲线的绘制。去官网下载qcustomplot压缩包,解压后有个examples文件夹,打开后提供了5个例程,打开plots例程,plots例程里面提供了21个demo(如下图),其中就包括动态曲线绘制,将setupDemo(10)函数的参数改成10就可以看到动态曲线的效果。
在这里插入图片描述

MainWindow::MainWindow(QWidget *parent) :
  QMainWindow(parent),
  ui(new Ui::MainWindow)
{
  ui->setupUi(this);
  setGeometry(400, 250, 542, 390);
  
  setupDemo(10);
}

将这个demo的核心代码copy下来就可以实现动态曲线。先用正弦产生曲线数据(如下图),在绘图区动态画出曲线波形。实现了动态曲线,接下来就需要将串口接收到的10个通道数据都画出来。
在这里插入图片描述

3. 通信协议

接下来需要制定通讯协议,并进行解析。软件与下位机(嵌入式系统)之间通过串口进行通信,需要一个协议(如下图),包括最多10个float型数据,帧头、帧尾一定有,但是中间的数据个数是不定的,最少一个数据,最多10个,所以通信协议长度是可变的。正是因为长度可变,而且帧尾不是固定的,又因为QT串口库的readAll()不能读取一帧数据,所以需要比较复杂的逻辑处理才能比较稳定的解析这个协议,这里不详细写了。
在这里插入图片描述
下位机的协议写成了serial_scope.c和serial_scope.h文件,下位机只需要在工程中加入这两个文件,按照如下方式调用即可:

DataScope_Get_Channel_Data(data1, 1);
DataScope_Get_Channel_Data(data2, 2);
DataScope_Get_Channel_Data(data3, 3);
DataScope_Get_Channel_Data(data4, 4);
DataScope_Get_Channel_Data(data5, 5);
DataScope_Get_Channel_Data(data6, 6);
DataScope_Get_Channel_Data(data7, 7);
DataScope_Get_Channel_Data(data8, 8);
DataScope_Get_Channel_Data(data9, 9);
DataScope_Get_Channel_Data(data10, 10);

int Send_Count = DataScope_Data_Generate(10);
uart1_send_data(DataScope_OutPut_Buffer, Send_Count);
4. 动态绘制通信数据

最后结合上述三个方面:串口收发数据、动态曲线绘制、通讯协议解析,将串口接收的数据绘制成动态曲线(如下图)就基本实现了软件最主要的功能。
在这里插入图片描述

5. 帮助文档

在这里插入图片描述

还有一些细节功能,比如保存数据、关闭时保存配置、量程自动缩放、拖动曲线和框选放大等,就不一一赘述了。

四、软件发布

  1. QT Creater中的Debug改成release,再run一遍;
    在这里插入图片描述
  2. 在新生成的release文件夹中将.exe文件复制到一个新建的单独的文件夹:release;
    在这里插入图片描述
  3. 打开QT命令行,注意如果电脑上装了好几个QT编译环境,那么就需要运行Configure Project里面配置的命令行;
    在这里插入图片描述

在这里插入图片描述

  1. 在QT命令行中,先用cd命令进入新建的单独的文件夹release的路径,再用命令:windeployqt serial_scope.exe,就发布成功了,所有依赖的动态库都打包到release文件夹了。
    在这里插入图片描述
    在这里插入图片描述
    版本记录:
    在“帮助”里面可以查看软件的当前版本。
    v1.0.0 —— 第一次发布的版本

下载链接:https://download.csdn.net/download/u014170067/85256970

  • 3
    点赞
  • 36
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
电脑串口链接示波器是一种用来分析电子电路中信号波形的仪器,而Python则是一种高级编程语言,可以用来控制计算机硬件设备。 要通过Python控制电脑串口链接示波器,需要先了解串口通信的原理和方法。一般来说,我们可以使用Python中的PySerial库来实现串口通信。首先要安装PySerial库,然后使用串口的相关参数(如波特率、数据位、校验位等)打开串口,然后发送和接收数据。 具体实现过程包括以下几个步骤: 1. 安装PySerial库 在命令行中输入以下命令进行安装: pip install pyserial 2. 打开串口 使用Python中的serial.Serial函数打开串口,如: ser = serial.Serial('COM1', 9600, timeout=1) 其中,‘COM1’代表串口号,9600代表波特率,timeout=1代表等待数据的时间长度为1秒。 3. 向串口发送数据 使用Python的serial.Serial对象的write方法向串口发送数据,如: ser.write(b'Hello, world!') 其中,b代表是bytes类型的数据,需要先编码。这句代码将向串口发送字符串“Hello, world!”。 4. 接收串口数据 使用Python的serial.Serial对象的read方法从串口读取数据,如: data = ser.read(10) 其中,10代表读取长度为10字节的数据。此外,还可以使用readline方法来读取一行数据。 通过以上步骤,就可以实现电脑串口链接示波器Python控制。可以根据具体的需求来设计发送和接收数据的命令。例如,可以通过Python发送一条指令,让示波器开始工作,然后读取示波器采集的电子电路信号波形进行分析和处理,最后输出结果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

巴普蒂斯塔

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值