USB继电器控制小工具
1. 基础知识介绍
tkinter
是一个简单入手,但是功能十分强大的GUI编程库,学习入门很快,如果你还不会,点击阅读Tkinter详细教程:- 强大的的GUI开发库 - Tkinter详细教程一
- 强大的的GUI开发库 - Tkinter详细教程二
- 强大的的GUI开发库 - Tkinter详细教程三
串口Uart
是嵌入式最基础,最简单,也是使用最广范的一种通信协议,在诸多通信都使用;pyserial
是python中处理串口通讯的一个模块名,操做十分简单,如果还不了解,点击阅读详细教程:- python serial模块详细教程
2. 需求背景介绍说明
-
usb控制继电器模块
常用在控制设备的上下电管理,常常用来自动化控制
、自动化测试
-
USB继电器就是通过串口通信协议控制继电器的,如下图是一个4路的USB继电器控制模块,通过USB连接电脑,控制继电器的开关,从而控制设备的上下电。
-
继电器的控制指令很简单,按照下图所示的说明,即可控制对应端口的开闭;控制协议为4个字节,含义如下:
- 数据1:
启动标识
,默认使用0xA0
- 数据2:
地址码
,即控制那路继电器,OUT 1就是0x01
,OUT 2就是0x02
- 数据3:
控制码
,0x00为关不反馈;0x01为开不反馈;0x02为关并反馈;0x03为开并反馈;0x04为取反并反馈;0x05为查询状态;0x06为闪断并反馈 - 数据4:
校验码
,前面三个数据相加的和
- 数据1:
-
控制工具需求说明
- 软件工具能够查找到指定的串口端口,并进行断开和连接
- 能够选择对应的端口
- 能够控制端口的闭合时长和断开时长
- 能够统计继电器工作时长
- 能够统计继电器的执行次数
-
按照工具需求,设计出的
软件工具界面示例图
如下图所示:
-
设计源码分成2部分
GUI界面设计
,设计出工具的界面继电器控制
,并将GUI的界面事件和控制指令进行绑定
3. GUI界面开发源码
- GUI界面源码文件名:
PowerControl.py
- 源码如下:
import sys, os
sys.path.append( os.path.dirname( os.path.dirname( os.path.abspath(__file__))))
import ttkbootstrap as tkbot
from ttkbootstrap.constants import *
import time
import PowerDriver as PowerDrv
class PowerControl_App(tkbot.Frame):
def __init__(self, master=None) :
super().__init__(master)
self.master = master
self.AllComChannel = [
"Not find"] # 端口设置
self.PowerChannel = [
"OUT 1" ,
"OUT 2" ,
"OUT 3" ,
"OUT 4"] # 继电器端口设置
self.LogDispalyList = [] # 数据显示窗口显示内容
self.PowerDriver = PowerDrv.PowerDriver() # 串口工具对象
self.ConnectTime = tkbot.StringVar()
self.DisConnectTime = tkbot.StringVar()
self.ConnectTime.set('120')
self.DisConnectTime.set('10')
self.IsFindPort = False # 是否检测到串口
self.IsSeriolConnect = False # 当前串口是否连接
self.IsPowerWork = False # 继电器是否工作
self.TimeHour = 0 # 执行时间统计
self.TimeMine = 0
self.TimeS = 0
self.createWidget(master)
def createWidget(self, master) :
InformDispalyFrame = tkbot.Labelframe(master, text=" 显示窗口 ", bootstyle="info")
InformDispalyFrame.place(x=13, y=5, width=700, height=340)
logsb = tkbot.Scrollbar(InformDispalyFrame, bootstyle="info-round")
logsb.pack(side=RIGHT, fill=Y)
Result_Display = tkbot.Text(InformDispalyFrame, bg="white", font=("宋体",12), yscrollcommand=logsb.set)
Result_Display.place(x=10, y=10, width=670, height=290)
logsb.config(command=Result_Display.yview)
def UpDateLogDisplay():
for item in self.LogDispalyList:
Result_Display.insert(END, item)
self.LogDispalyList.clear()
master.after(100, UpDateLogDisplay)
UpDateLogDisplay()
def findSeriol() :
if self.IsSeriolConnect :
self.LogDispalyList.append("通信串口已连接"+"\n")
else :
if self.PowerDriver.Find_Seriollist() :
self.AllComChannel = self.PowerDriver.Get_Seriollist()
PortChannelCombobox["value"] = self.AllComChannel
PortChannelCombobox.current(0)
SerilPort = str(self.AllComChannel[0])
SerilPortStr = SerilPort[0:5]
self.PowerDriver.Set_SeriolChanel(SerilPortStr)
self.IsFindPort = True
Length_text = "设置通信串口 : " + SerilPortStr +"\n"
self.LogDispalyList.append(Length_text)
else :
self.IsFindPort = False
self.AllComChannel = ["Not find"]
PortChannelCombobox["value"] = self.AllComChannel
PortChannelCombobox.current(0)
self.LogDispalyList.append("未检测任何到串口"+"\n")
Refresh_Btn = tkbot.Button(master, text="串口刷新", bootstyle="info-outline",
command= findSeriol)
Refresh_Btn.place(x=30, y=360, width=100, height=40)
PortChannelLable = tkbot.Label(master