如何使用Python开发串口通讯上位机(完结)
2021的第一份更新,比以往时候来得早一点!
前面两期讲了如何使用pyserial和做好了基本的上位机界面以及与API的联动,今天我们接着完善下代码。
编码规范的使用
前面两期只是做基础展示用,所以代码写得随意。但是纵观一份软件的开发和使用周期,实际开发阶段编码的时间占比很少,而绝大部分时间都处于代码调试、查阅以及优化升级中,因此代码的可读性与可维护性至关重要。所以大家在编码之前不妨先熟读一下Python常用的编码规范PEP8,增强代码可读性的同时也能拉近你和其他开发者间的距离。
由于UI文件自动导出的py文件没有严格遵循PEP8,因此为了保证风格一致,我的在UI代码文件中新增的代码会维持自动代码的风格。另外为了快速区分不同类型的组件,我一般习惯如下方式规定前缀:
- Text输入显示:前缀TXT_
- Button组件:前缀B_
- Label组件:前缀L_
- Listwidget:前缀LW
类,函数与变量的命名规则可以参照如下:
类的使用
接触过C++,C#等语言的小伙伴,对类的概念应该不陌生,类提供了一种组合数据和功能的方法。对于串口通信而言,我们可以把常用操作(初始化,扫描可用串口号,数据收发等)封装成一个类,通过继承与派生,方便我们在不同项目中移植使用,增加代码复用率,避免无谓地重复造轮子。
线程的使用
上一期的接收函数,我们直接写成一个死循环,在主程序中调用,会导致页面的刷新不够及时。所以此子章节来讲讲如何创建线程,并让线程自行管理数据接收轮询。
线程(Thread)也叫轻量级进程,是操作系统能够进行运算调度的最小单位,它被包涵在进程之中,是进程中的实际运作单位。线程自己不拥有系统资源,但它可与同属一个进程的其它线程共享进程所拥有的全部资源。就以我们这个上位机为例,上位机软件本身可以认为是一个进程,它的页面刷新与响应,以及接下来说的串口接收,可以认为是同属上位机进程的线程。
此处,在打开串口成功以后,我们将接收操作放入一个线程中,并在检测到用户点击关闭串口后结束。
另外,页面动态刷新,我们其实也可以创建一个周期性执行的线程用于内容可变的组件的刷新。
队列的使用
我们的上位机功能相对简单,其实没必要用到FIFO队列。但是如果在做复杂功能时,例如需要对接收数据进行进一步处理时或者有多处线程需要发送数据时,不妨使用队列进行数据管理存储。队列的本质为先进先出的数据结构,在python标准库中已经封装好了的线程安全的队列, 简化了我们多线程的信息传递。
此处,我们将接收到的数据放入队列.
数据接收十六进制显示
接收可以选择将数据以Hex显示还是ASCII显示,此处结合radio button讲讲如何实现。radio button有个属性为isChecked,表征是否被选中。另外通过hex函数可以将数值转换成16进制, 并以0x开头的字符串形式显示。而如果要显示当前整数对应的 ASCII 字符,则使用chr()函数
总结
本篇主要介绍了几个提高代码可读性和可维护性以及代码优化的方法,限于篇幅,发送数据格式的转换就不提及了,当作课后小作业进一步完善这份上位机。
码字不易,赞赏后会在下方显示获取源码的方法。