图形用户界面编写和串口通信是自动化仪器程序开发会涉及到的关键性问题之一,界面用于人机交互,串口通信可用于控制仪器设备的运行、数据采集等。对于从事化学、生物等理科专业的研究人员,想必也没有那么多精力去学习复杂的C++等编程语言,因此对于没有编程基础的读者,推荐学习一下Python或MATLAB,能在相对较短的时间内入门。
在本文中,我将基于Python,编写一个串口调试工具,所涉及到的库有tkinter(用户界面开发),serial(串口),threading(线程),正好可以大致了解一下图形用户界面编写、串口通信和多线程的知识。用python作为开发语言的目的是:(1)丰富的第三方库,开发效率高;(2)程序可在多个平台上运行,如Windows, Mac, Linux系统,还可以移植到嵌入式平台。当然,对于喜欢使用MATLAB的读者,后续我也会写MATLAB相关的文章。
本文中,我使用的串口设备为一块窄脉冲发生器,波特率为9600,终止符为“rn”,它有自己的串口通信指令表。如果读者手上有一块基于串口通信的运动控制卡,在完成电机、驱动器和控制卡的连接后,读者即可通过串口通信指令,实现电机的控制(见后续文章)。
注:本文需要一定的python, tkinter基础。默认的串口通信参数:终止符为“rn”,数据位8,停止位1,奇偶校验无。
首先来看一下这个程序所实现的功能:
(1)程序运行后显示界面,此时“连接”和“发送”按钮不可用。若此时没有插入串口设备,点击下拉按钮不会显示串口号;插入串口设备后,点击下拉按钮,会显示所有可用的串口号。如下图1所示。
(2)用户在选择串口号后,“连接”按钮变可用,点击“连接”按钮连接串口,“发送”按钮变可用。此时用户可在输入框中输入串口指令,按回车键或点击“发送”按钮,发送串口指令。发送的指令和接收到的反馈信息(来自串口设备)将实时显示在文本框内。如下图2所示。
下面是程序部分,使用时将Serial_GUI类导入,然后创建一个实例即可运行。注意,其中导入的threading1,并不是threading,它加入了退出线程的功能。代码如下:
Serial_GUI
import
threading1
import threading
class threading1(threading.Thread):
def __init__(self, *args, **kwargs):
super(threading1, self).__init__(*args, **kwargs)
self.__flag = threading.Event() # 用于暂停线程的标识
self.__flag.set() # 设置为True
self.__running = threading.Event() # 用于停止线程的标识
self.__running.set() # 将running设置为True
def pause(self):
self.__flag.clear() # 设置为False, 让线程阻塞
def resume(self):
self.__flag.set() # 设置为True, 让线程停止阻塞
def stop(self):
self.__flag.set() # 将线程从暂停状态恢复, 如何已经暂停的话
self.__running.clear() # 设置为False
演示视频如下(接上我自己的串口设备,但录视频软件未能捕捉到下拉按钮弹出的界面,实际上下拉按钮弹出“COM11”的选项,如图1所示):
Python串口调试工具https://www.zhihu.com/video/1116821702822219776
有问题可留言。