USB继电器控制小工具

USB继电器控制小工具

1. 基础知识介绍

  • tkinter 是一个简单入手,但是功能十分强大的GUI编程库,学习入门很快,如果你还不会,点击阅读Tkinter详细教程:
    1. 强大的的GUI开发库 - Tkinter详细教程一
    2. 强大的的GUI开发库 - Tkinter详细教程二
    3. 强大的的GUI开发库 - Tkinter详细教程三
  • 串口Uart是嵌入式最基础,最简单,也是使用最广范的一种通信协议,在诸多通信都使用; pyserial是python中处理串口通讯的一个模块名,操做十分简单,如果还不了解,点击阅读详细教程:
    • python serial模块详细教程

2. 需求背景介绍说明

  • usb控制继电器模块常用在控制设备的上下电管理,常常用来自动化控制自动化测试

  • USB继电器就是通过串口通信协议控制继电器的,如下图是一个4路的USB继电器控制模块,通过USB连接电脑,控制继电器的开关,从而控制设备的上下电。
    在这里插入图片描述

  • 继电器的控制指令很简单,按照下图所示的说明,即可控制对应端口的开闭;控制协议为4个字节,含义如下:

    1. 数据1:启动标识,默认使用0xA0
    2. 数据2:地址码,即控制那路继电器,OUT 1就是0x01OUT 2就是0x02
    3. 数据3:控制码,0x00为关不反馈;0x01为开不反馈;0x02为关并反馈;0x03为开并反馈;0x04为取反并反馈;0x05为查询状态;0x06为闪断并反馈
    4. 数据4:校验码,前面三个数据相加的和
      在这里插入图片描述
  • 控制工具需求说明

    1. 软件工具能够查找到指定的串口端口,并进行断开和连接
    2. 能够选择对应的端口
    3. 能够控制端口的闭合时长和断开时长
    4. 能够统计继电器工作时长
    5. 能够统计继电器的执行次数
  • 按照工具需求,设计出的软件工具界面示例图如下图所示:
    在这里插入图片描述

  • 设计源码分成2部分

    1. GUI界面设计,设计出工具的界面
    2. 继电器控制,并将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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

园长QwQ

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值