周末撸了一个串口虚拟示波器,之前用别人开发的经常有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

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

  1. QT之QCustomPlot绘图实现8通道串口虚拟示波器

    QT之QCustomPlot绘图实现8通道串口虚拟示波器----串口插拔自动检测 QT之QCustomPlot绘图实现8通道串口虚拟示波器----QCustomPlot实时绘图 QT之QCustomP ...

  2. 基于STM32F103C8T6的USB虚拟示波器

    1.概述 很久很久以前,在立创买了块虚拟示波器的空板,没事的时候把它做出来了,然后就扔在那里了,回顾一下,顺便折腾下看能不能弄好. 这是官方给的效果图,我实际收到的板子是绿色的,其他跟图上基本一致,B ...

  3. 【Qt串口波形绘图】基于QCustomPlot的串口波形绘图上位机,源码开放

    之前写了一款串口调试上位机,有很大的功能欠缺,整体感觉十分不爽.这次在原有基础上进行了优化,并且增加了协议帧捕获功能,使用QCustomPlot进行波形绘图的功能,可应用于实时动态绘图.(直男审美,实 ...

  4. 基于STM32的虚拟示波器

    仓库地址 https://github.com/shuai132/ScopeMCU ScopeMCU Oscilloscope for MCU MCU: STM32F103C8Tx 需配合ScopeG ...

  5. 推荐一款好用的串口波形显示助手----虚拟示波器

    文章目录 前言 一.虚拟示波器是什么? 二.去哪里下载 1.下载源码 2.解压 三.如何移植到单片机 1.添加.c,.h文件 2.替换串口字节发送函数,如send_char(databuf[i]); ...

  6. QT5系列教程二---基于qcustomplot的QT5 GUI串口收发绘图软件实现

    QT5系列教程二---基于qcustomplot的QT5 GUI串口收发绘图软件实现 结构 UI部分 代码部分 step1:实现串口数据接受 串口接受数据格式 在`.pro`文件中添加`serialp ...

  7. 关于山外多功能调试助手的虚拟示波器的使用说明

    关于山外多功能调试助手的虚拟示波器的使用说明 通信方式:串口(uart)协议 设定波特率,数据位,校验位,停止位等等 关于虚拟串口的特性 1. 支持8通道的波形,并且自定义波形名称 2. 支持同时预览 ...

  8. Jlink使用技巧之J-Scope虚拟示波器功能

    J-Link简介 J-Link是SEGGER公司为支持仿真ARM内核芯片推出的JTAG仿真器.简单地说,是给一个JTAG协议转换盒.其连接到计算机用的是USB接口,而到目标板内部用的还是jtag协议. ...

  9. 虚拟示波器OSC802介绍、拆机

    介绍 外壳正面贴的标签明确告知了OSC802示波器的一些参数,2通道,-5V~+5V(此电平的话应该是探头在1x衰减档时刻的,如果配上标配的探头打在10x衰减档的话可以测量-50V~+50V电平),8 ...

  10. WinCE下串口虚拟软件

    前段时间,介绍了一个WinCE下的串口调试软件Serial Splitter Mobile 3.2.它的主要功能是将一个物理串口克隆成N个,供不同的应用程序使用,以监视物理串口收发的数据.今天介绍一个 ...

最新文章

  1. java 合并txt文件_java合并文本文件并删除文件中重复行
  2. Windows下配置scrapy需要MVC的14.0版本(转载)
  3. 面向领域的微服务架构
  4. 直流电路相关计算机,计算机专业用复杂直流电路习题(各种方法运用).doc
  5. CLH锁 、MCS锁
  6. windows10上运行linux,在Windows 10上原生运行Linux
  7. OSI七层网络模型TCP&UDP
  8. java链表list_java自定义List链表
  9. python 随机数_Python中的随机数
  10. Wireshark系列之7 利用WinHex还原文件
  11. jquery源码解析:jQuery延迟对象Deferred(工具方法)详解1
  12. WGS-84与北京-54、西安-80及地方坐标系的转换
  13. 2021年焊工作业压力焊考试题库
  14. getData 函数
  15. 试卷自动生成工具使用说明
  16. 3DSMAX联机渲染、网络渲染、分布式渲染效率评测
  17. bugku bingo题解
  18. java雪崩_了解java架构之微服务架构—雪崩效应
  19. ComposeOptions.kotlinCompilerVersion is deprecated
  20. 南大通用数据库(2):客户端的使用(GBase 企业管理器的使用)

热门文章

  1. 品牌如何正确联动B站UP主“恰饭视频”,最近一支不像恰饭视频的作品在B站火了
  2. 单片机:红外遥控实验(内含红外遥控介绍+硬件原理+软件编程+配置环境)
  3. ARM开发软件ADS教程
  4. 智课雅思词汇---八、ject是什么意思
  5. 解析Hl7消息,将消息可视化
  6. USB转RS422/485/232串口线异常问题记录
  7. 金洪林:红邦创衣止于至善_品牌-生活时尚_品牌_YOKA时尚网
  8. C++练习 - 字符转换
  9. uni-app 的 tabBar 图标自制方法
  10. 坚持定投3年,我赚了多少钱?