HNU数字系统实验——大综合3(传感器数字采集系统)—优化版

最开始的那个版本放的是最后交上去的限制页数的版本,最近又找到了但是写的第一版实验报告,比较详细,图片也比较清晰,放出来供大家参考

工程链接:https://pan.baidu.com/s/1b6N0djLRpl_25lDw_0eUVg
提取码:cvqn
包含实验==综合实验1、2、3的工程
仅供参考!

实验指导书

0.简介

初步设计一个复杂数字系统-传感器数字采集系统,理解扩展接口的超声波测距和通用USB-TTL串口电路原理;实现其实作模块功能验证;分层次编写VHDL完成系统模块优化方案,验证平台,FPGA串口与PC上位机软件(可选),并验证调试。

1. 传感器数字采集系统实验3

时间:1周
环境:VS2010、编程语言:C#或其他
步骤:搭建桌面开发环境,选题并完成设计
在这里插入图片描述
实操(以下任务任选其中一项):

1.A级任务1(100%)

设计一个上位机图形界面软件,接收上周测量所得的8位距离采样值,完成计算并显示距离为30cm-250cm,图形界面如下图所示。
搭建实验测试环境,完成验证。配置好虚拟串口软件,利用串口助手发送采样值。配置上位机软件如图中①串口设置(SerialPort 组件),观察接收数据区如图中②区域,在区域③中(chart组件)完成图表。其他功能组件可自行设计添加并验证。
在这里插入图片描述

注:博主选的就是这个实验,自己做一个上位机

2. 完成报告并提交

报告要求:
学生信息、实验目标与资源、设计思路、验证以及结果分析,从人文、知识、技能三个方面完成本期实验总结。
大综合实验依据难度分为:大综合1(80%)、大综合2(90%)、大综合3(100%),最后提交报告和工程各自选择,如做完大综合3需要提交:大综合1、2、3次的报告和工程。
大综合作业请于6月14日晚23:59分之前提交(PDF文件和工程文件,PDF文件名和工程文件压缩包,请注明自己的名字),文档正文不超过6页,大小不超过5MB。
在这里插入图片描述

传感器数字采集系统实验3

任务:
设计一个上位机图形界面软件,接收上周测量所得的8位距离采样值,完成计算并显示距离为30cm-250cm。
搭建实验测试环境,完成验证。配置好虚拟串口软件,利用串口助手发送采样值。

一、 实验资源

python(用于实现上位机界面的各个功能)
PyQt5、Qt designer(绘制界面)
本来想利用教学组的 VS 来进行编写的,但是初期经过查找资料,发现 python 实现较为简单,
python 的生态库非常庞大,可以直接调用第三方库实现界面的功能编写,而且这也是一个
很好的学习 python 的机会,在两个星期内压榨自己初步掌握 python 的基本语法。

二、 实验日志

2020.6.8-2020.6.9:python 快速入门,两天时间看完了北理工 python 的 mooc,初步掌握python 的语法和常用数据结构;

最好现在好好学下python,后面一个学期学习人工智能或者机器学习的时候必用

2020.6.10:搭建实验环境,python+PyQt5 的环境还算好搭建,网上有不少教程,花了一个上午的时间将环境完全配置好;
2020.6.10-2020.6.11:学习 Qt designer 的使用技巧,初步绘制了一个粗糙的上位机界面;
2020.6.12-2020.6.13:花了近 2 天的时间把串口的基本通信功能(发送、接受)实现,安装需要的第三方库,优化界面的布局,渐入佳境;
2020.6.13-2020.6.14:实现 GUI 内嵌图形的绘制,进一步优化界面,去除没有能力实现的功能和不需要的功能,实现了整个上位机界面的功能。
在制作的过程中参考了很多博客、舍弃了好几种失败版本,一路磕磕绊绊,幸而最终还是完成了。

三、 实验过程

1、 实验环境搭建

①主要安装 pycharm,PyQt5,其它还有很多小细节不再赘述;
②将安装好的 Qt designer、QtUic 添加到 pycharm 的外部工具中,以便后面使用;
最终安装好的界面如下:此时可以通过 pycharm 直接打开 desiger 界面以及将绘制好的 ui 文件转为 py 文件;
在这里插入图片描述

2、 ui 界面的绘制

界面如下图所示,这是最终版,中间修改过好多次,包括把图像显示板块里的初始化功能给删除了(实在没有能力实现)
由五个板块组成,包括串口通信的设置、发送、接收、串口状态以及图像处理;
除了处理部分,前面的通信部分基本上与教学资源的串口助手功能一致;
数据收发都支持 16 进制;
在这里插入图片描述

3、 直接使用 Qtuic 来将上面制作的 ui 界面转化为 py 文件

界面的结构(仅截取部分):

这一部分代码是自动转化得到的,我们只需要使用qt绘制界面

在这里插入图片描述
界面中按钮、选项、文本框的信息(部分截取)
在这里插入图片描述

4、 串口通信功能的实现

这一部分参照了很多代码,最终实现了以下的串口通信部分;主要依靠使用 pyserial 进行串口传输,在 secendstep.py(新建)中补充事件处理功能。
串行口的属性:
name:设备名字 portstr:已废弃,用 name 代替 port:读或者写端口 baudrate:波特率
bytesize:字节大小 parity:校验位 stopbits:停止位 timeout:读超时设置
1) 初始化
在这里插入图片描述
2) 按钮功能函数链接
直接使用 PyQt5 库中的 QtWidgets 类来实现将界面上的按钮与相应功能所连接。
在这里插入图片描述

3) 功能函数实现(以打开串口、接受数据为例)
【打开串口】
在这里插入图片描述
利用第三方库 PyQt5 中的类和其中的函数实现串口选择、波特率设置、字节数设置、停止位(只有 1)、校验位(只有 N 也就是不校验)设置;
尝试开启串口,开启失败则反馈信息,成功则打开接收数据的定时器,设置按钮的状态更新串口状态模块的 groupBox 的标题信息。
【接受数据】
在这里插入图片描述
首先用 inWaiting 函数等待数据,如果无法接受则关闭串口(发生错误),否则根据收到的字节数将数据用 read 函数读出到字符串 data 中;如果选择 hex 显示,则需要进行进制的转换,否则转化为 unicode 字符串传给 insertPlainText 函数,在窗口中显示。
注:其余也都是类似的利用第三方库来实现各个功能,详见工程文件。
4) 串口通信功能验证
在这里插入图片描述

①首先利用虚拟串口打开虚拟串口通道
②将串口助手与编写的上位机软件设置好,波特率为 9600,数据位为 8,打开两个串口;
在这里插入图片描述
此时虚拟串口也显示 COM3、COM4 连接成功;
③验证发送与接受两方面功能(包括 hex 进制):
串口助手发送 123456、我的上位机用 hex 发送 55:串口助手 hex’发送 55、我的上位机发送 123456
在这里插入图片描述
接受、发送功能均正常;
经过验证,清除数据等小功能均正常实现

5、 数据图像显示

这一部分网上也很没有直接讲如何讲串口接受的数据转化成图像的,我是先学习了如何根据一组数据绘制图像以及如何将图像内嵌到上位机界面中之后自己编写的代码;
1) 在上位机界面中加入用于图像显示的窗体 Widget
在这里插入图片描述
为了嵌入 Matplotlib 在 mplCanvas 中,需要将 mplCanvas 升级,执行 Promote,输入类名 称 为 MplCanvasWrapper , 这 个 类 就 是 编 写 matplotlib 代 码 的 , 文 件 名 称 为mplCanvasWrapper。
2) 新建 py 文件(mplCanvasWrapper.py)并在其中编写图像处理的类和相关功能函数,为窗体添加事件处理
①主要依靠 matplotlib 库中的 figure 类来实现画图;
在这里插入图片描述

②令 x 轴显示时间并动起来
X 轴显示时间,matplotlib 提供了 plot_date 方法;
设计一个线程,用于产生数据和绘图,根据功能单一原则,需要将产生数据和绘图分成两类来实现,一个数据处理类,一个画板类。
③在 MplCanvas 类中使用 FigureCanvas 和 Figure 类创建 plot 绘制窗口(画板)
在这里插入图片描述

这里值得注意的是上面的两句设置画板语句,令画板的横坐标在前 1 分钟每 10s 显示一次时间,后面变成每 1 分钟显示一次时间;
在这里插入图片描述
时间的显示格式设置为时分秒;
④在 MplCanvasWrapper 类(数据处理)中写绘图的逻辑,界面和实现完全分离
在这里插入图片描述

五个函数分别实现开启画图(startPlot)、停止画图(pausePlot)、开始画图前的准备(initDataGenerator)、退出时的清空(realease)、以及接受数据添加画图(generateData);
其中前面四个函数的实现较为简单,只需要改变类_generating 的状态就可以;
secengstep.pyPyqt5_Serial 类中可以通过引用他们来实现图形绘制的控制:
在这里插入图片描述
closeEvent 是我写的一个关闭窗口时的提示信息,关闭窗口时先提示是否关闭,如果选择 yes则需要通过调用 realeasePlot 来清空图像,然后直接关闭界面,效果如下:
在这里插入图片描述
⑤接受数据并绘制到图像上(接受数据添加画图(generateData))

在这里插入图片描述
这是整个图像部分里面最难实现的,我试了很多种方法,一直无法实现接受一个数据就实时更新图像;
退而求其次,我选择让他每隔 1s 就将接受的数据与相应的时间添加到用于绘图的数组中,进而实现绘图,而如果一直没有新的数据,那么每秒将保持将旧的数据画出来。

self.dataY.append(int.from_bytes(BL.data,byteorder='little'))

里面的这一句表示将接受的数据从 byte 转化为 int,也就是说串口助手需要 hex 发送才可以正确显示;
而接受数据的类我是写在了 secendstep.py 文件中的,如何让 mplCanvasWrapper.py 文件中的类来使用它呢,很简单直接开一个新的 py 文件用于保存这些量,让其他文件直接 import这个文件即可,里面的数据将变成公用的(上右图);

到这里所有功能就全部实现了,接下来验证图像显示。

3) 图像显示验证
①打开串口助手与写好的上位机软件,令串口助手 hex 的形式一个一个数据发送;
②在上位机软件中选择 hex 接受并且开始绘图;
②在发送的过程中更改串口助手发送的数据,观察图形的显示;
图像是一个动态过程,这里不方便显示出它的过程,详见工程文件的上位机软件成品。
在这里插入图片描述
可以看出,图象是根据接受到的数据来进行显示的,验证正确
数据的发送通过串口助手完成,每次仅能发送一个不大于 100(10 进制)数据,而不能一次性发送多个数据,这样的话我的程序会将几个数据识别为一个很大的数据,超过图像显示的范围 100,无法看出轨迹,数据的改变只能通过手动更改,这也是一个不完美的地方吧。

四、 利用 pyinstaller 将 py 文件打包生成 exe 文件

直接在 pycharm 的终端 Terminal 中输入指令
pyinstaller -i tubiao.ico -w -F secendstep.py Ui_form.py mplCanvasWrapper.py BL.py 即可;
在这里插入图片描述
.ico 文件图标作为生成的 exe 的图标,zsl 是我名字的缩写。
最终在 dist 目录下生成了 exe 文件,体积有 76M;
在这里插入图片描述
生成的 exe 文件体积过大,我尝试用很多方法包括在虚拟环境中(纯净 python 没有那么多杂库)进行打包生成、使用 UPX 进行压缩等等方法,最后 exe 文件的体积完全没有减少,保持在 74M 左右(比教学资源上的串口助手要大一倍,可能是因为添加了图形显示的原因),因此我的工程包 exe 软件较大。
经过验证,exe 文件的功能与 py 文件的相同。

五、 小结

做上位机软件我一共花了 1 个星期的时间,这个星期真的非常的充实。刚开始时只有一个星期,那个时候觉得绝对做不完,然后现在在写报告的时候发现有的时候确实太小瞧自己了,只要把自己的精力全部投入进来很多事情还是可以做到的。其实对于数字系统这门实验我是有过抱怨的,毕竟今年受疫情影响好多教学计划都变更了,那么短的时间去完成这样的实验真的很难;后来经过教学组的老师们的解惑以及时间的延迟又给了我继续做下去的动力,还好没放弃,不然不会知道自己的极限在哪里。

传感器数字采集系统实验- 实验总结

从人文方面看,这学期的实验算是逐层加深难度并且层层相扣,从最开始的三位数码管到串口通信、FIFO存储,再到最后的这个传感器数字采集系统实验,为我们展开了非常丰富的数字世界,虽然并不是非常深入的学习,但也了解了很多,可以说是为了后面的课程打下了基础吧。
此外,这一个学期新的知识是学习了很多的,包括数码管显示原理、串口通信原理、FIFO存储原理等等。这些知识有的很晦涩难懂,但是真正学懂后又会觉得十分的精巧。教学组提供的课后思考题和相关资源十分全面,帮助我们更好的理解和消化这些知识。
当然,技能方面也收获颇丰。这一学期首先掌握了proteus的使用方法,并且主要加深了quartus的应用技巧,三位数码管里的修正输出的电路设计和实验最后的分频电路都非常有趣并且十分有用,我相信这些技能将来即使用不上也能开拓思路。可惜的是这学期在家学习没能用上学校的实验板,最后的倒车雷达没办法实操,好在教学组通过protues仿真的方式弥补这一缺憾。最后当然是制作上位机界面软件这一过程上学到的各种技能了,这两个星期成长了太多太多。
数字系统实验圆满结束,感谢教学组精心准备的scrom资源以及每周的任务说明,一个学期让我学到了很多新的东西。

  • 2
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值