<Python>简易串口调试助手(优化版,功能和界面优化)

发布于:2022-10-14 ⋅ 阅读:(649) ⋅ 点赞:(0)

1 软件配置

1 使用软件

python有很多编辑器,pycharm、vscode都可以,本例用的是vscode
在这里插入图片描述
系统平台:windows10
在这里插入图片描述

2 安装方式

1、VS code:vscode是微软旗下的一款程序编写器,可以直接在其官网下载,免费,不过微软服务器下载有时候会很慢,可以搜索一下国内镜像下载,会快不少。
2、Pycharm:如果不想用vscode,可以用Pycharm,Pycharm是Jetbrain公司旗下的软件,也可以在其官网下载(有免费版,个人用足矣。)

2 需要的包

1、PyQt5
2、serial、pyserial
安装方式直接使用pip就可以:

pip install PyQt5

其他类似

3 程序

串口调试程序,我之前写过一个:
https://blog.csdn.net/normer123456/article/details/124402399
这次是在之前的基础上,增加了一下界面优化的内容和功能上优化。
先说界面优化:
界面优化使用了Qt提供的Qss样式:

qss格式大概是这样
在这里插入图片描述
可以看到,就是对窗口及其子控件进行美化,如字体、字体位置、背景色、等等,这是完全自定义的,自己调整到一个合适的界面配置即可,比如我自己设置的:
在这里插入图片描述
qss文件调用:

 self.qss_style_file='E:\\100proworld2021\Python2022\style.qss'
 self.qss1=QssRead.readQSS(self.qss_style_file)

我这里是单独写了一个函数,用于读取qss文件,然后在串口的程序引用即可。

from qss_read import QssRead

qss_read.py内容如下:

class QssRead:
    @staticmethod
    def readQSS(style):
        with open(style, "r") as f:
            return f.read()

可以看到,就是读取qss文件的内容并返回。
调用完,还要设置主窗口的style:

self.setStyleSheet(self.qss1)

以下是完整程序:

from asyncio.windows_events import NULL
from numpy.lib.function_base import place
import serial
import serial.tools.list_ports
import sys
import re
import os
import threading
import datetime
from PyQt5.QtCore import *
from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
from qss_read import QssRead

class serial_win(QWidget):
    def __init__(self) -> None:
        super().__init__()
        self.initUI()
    def initUI(self):

        self.qss_style_file='E:\\100proworld2021\Python2022\style.qss'
        self.qss1=QssRead.readQSS(self.qss_style_file)

        self.port=''
        self.baud=0
        self.timeout=0.0

        self.send_data=bytes()
        self.read_data=''

        self.btn_plist=QPushButton('获取可用串口',self)          #新建按钮实例
        self.btn_plist.setGeometry(20,20,60,20)                 #按钮布局位置
        self.btn_plist.clicked.connect(self.get_serial_info)    #按钮链接函数
        self.btn_plist.adjustSize()                             #按钮自适应文本

        self.btn_serial_init=QPushButton('串口初始化',self)
        self.btn_serial_init.setGeometry(20,50,60,20)
        self.btn_serial_init.clicked.connect(self.serial_init)
        self.btn_serial_init.adjustSize()

        self.btn_serial_open=QPushButton('打开串口',self)
        self.btn_serial_open.setGeometry(20,80,60,20)
        self.btn_serial_open.clicked.connect(self.open_serial)
        self.btn_serial_open.adjustSize()

        self.btn_serial_close=QPushButton('关闭串口',self)
        self.btn_serial_close.setGeometry(20,110,60,20)
        self.btn_serial_close.clicked.connect(self.close_serial)
        self.btn_serial_close.adjustSize()

        self.btn_read_data=QPushButton('读取数据',self)
        self.btn_read_data.setGeometry(20,140,60,20)
        self.btn_read_data.clicked.connect(self.read_serial_data)
        self.btn_read_data.adjustSize()

        self.btn_send_data=QPushButton('发送数据',self)
        self.btn_send_data.setGeometry(40,460,60,20)
        self.btn_send_data.clicked.connect(self.send_serial_data)
        self.btn_send_data.adjustSize()

        self.serial_port_set=QComboBox(self)
        self.serial_port_set.setGeometry(500,20,100,20)
        self.serial_port_set.addItems(['COM1'])

        self.label_port_set=QLabel(self)
        self.label_port_set.setGeometry(420,20,60,20)
        self.label_port_set.setText('串口号:')

        self.serial_baud_set=QComboBox(self)
        self.serial_baud_set.setGeometry(500,50,100,20)
        self.serial_baud_set.addItems(['9600','19200','38400','115200'])

        self.label_baud_set=QLabel(self)
        self.label_baud_set.setGeometry(420,50,60,20)
        self.label_baud_set.setText('波特率:')

        self.serial_stopbit_set=QComboBox(self)
        self.serial_stopbit_set.setGeometry(500,80,100,20)
        self.serial_stopbit_set.addItems(['0','1'])

        self.label_stopbit_set=QLabel(self)
        self.label_stopbit_set.setGeometry(420,80,60,20)
        self.label_stopbit_set.setText('停止位:')

        self.serial_parity_set=QComboBox(self)
        self.serial_parity_set.setGeometry(500,110,100,20)
        self.serial_parity_set.addItems(['无','奇校验','偶校验'])

        self.label_parity_set=QLabel(self)
        self.label_parity_set.setGeometry(420,110,60,20)
        self.label_parity_set.setText('校验位:')

        self.serial_databit_set=QComboBox(self)
        self.serial_databit_set.setGeometry(500,140,100,20)
        self.serial_databit_set.addItems(['8','7'])

        self.label_databit_set=QLabel(self)
        self.label_databit_set.setGeometry(420,140,60,20)
        self.label_databit_set.setText('数据位:')

        self.serial_timeout_set=QLineEdit(self)
        self.serial_timeout_set.setGeometry(500,170,100,20)
        self.serial_timeout_set.setText('1000')

        self.label_timeout_set=QLabel(self)
        self.label_timeout_set.setGeometry(420,170,60,20)
        self.label_timeout_set.setText('超时时间:')

        self.label_timeout_set2=QLabel(self)
        self.label_timeout_set2.setGeometry(610,170,60,20)
        self.label_timeout_set2.setText('ms')

        self.le_send_data=QLineEdit(self)
        self.le_send_data.setGeometry(120,460,300,20)
        self.le_send_data.setText('1111')

        self.le_recv_data=QTextEdit(self)
        self.le_recv_data.setGeometry(120,220,600,200)
        
        self.setGeometry(100,100,800,600)
        self.setWindowIcon(QIcon('E:\\100proworld2021\Python2022\cat.ico'))     #为窗口添加ICON
        self.setWindowTitle('串口调试助手')
        self.setStyleSheet(self.qss1)
        self.show()

    def get_serial_info(self):

        self.plist=list(serial.tools.list_ports.comports())
        if len(self.plist) <=0:
            print('无串口可用')
            qm=QMessageBox.warning(self,'提示','未找到串口,请检查接线')
            if qm == QMessageBox.Yes:
                print('Yes')
            else:
                print('no')
        else:
            for i in list(self.plist):
                self.serial_port_set.addItems(i.name)
    def serial_init(self):
        self.port=self.serial_port_set.currentText()
        self.baud=int(self.serial_baud_set.currentText())
        self.timeout=float(self.serial_timeout_set.text())
        try:
            self.serial1=serial.Serial(port=self.port,baudrate=self.baud,bytesize=8,parity='N',stopbits=1)
            print(self.serial1)
            if self.serial1.isOpen:
                print('串口正常')
        except Exception as e:
            QMessageBox.warning(self,'提示!',str(e),QMessageBox.Ok | QMessageBox.Cancel,QMessageBox.Ok)
            print('异常:',e)
    def open_serial(self):
        try:
            self.serial1.open()
        except Exception as e:
            QMessageBox.warning(self,'提示!',str(e),QMessageBox.Ok | QMessageBox.Cancel,QMessageBox.Ok)
            print('异常:',e)
    def close_serial(self):
        try:
            self.serial1.close()
        except Exception as e:
            QMessageBox.warning(self,'提示!',str(e),QMessageBox.Ok | QMessageBox.Cancel,QMessageBox.Ok)
            print('异常:',e)
    def read_serial_data(self,way):
        print('开始接收数据:')
        while True:
            try:
                if self.serial1 is NULL:
                    break
                if self.serial1.inWaiting:
                    if(way == 0):
                        for i in range(self.serial1.inWaiting):
                            print('接收ASCII数据:' + str(self.read_data_size(1)))
                            data1=self.read_data_size(1).hex()
                            data2=int(data1,16)
                            print('接收到16进制数据:' + data1 + '接收到10进制数据:' + str(data2))
                    if(way == 1):
                        data=self.serial1.read_all()
            except Exception as e:
                print('异常:',e)
                break

    def send_serial_data(self):

        current_dt=datetime.datetime.now()                          #获取系统时间
        current_dt_str=current_dt.strftime("%Y-%m-%d %H:%M:%S")     #格式化时间

        try:
            self.send_data_str=self.le_send_data.text()
            self.send_data=bytes.fromhex(self.send_data_str)
            self.serial1.write(self.send_data)
        except Exception as e:
            QMessageBox.warning(self,'提示!',str(e),QMessageBox.Ok | QMessageBox.Cancel,QMessageBox.Ok)
            print('异常:',e)
if __name__ == '__main__':
    app=QApplication(sys.argv)
    ex=serial_win()
    sys.exit(app.exec_())    


style.qss:

/*
*
{
color:red;
}
*/
QWidget
{
    background-color: rgb(142, 221, 235);
}
QPushButton
{
text-align:center;
color:rgb(14, 13, 13);
background-color:rgb(250, 250, 252);
}
QLabel
{
text-align: center;
font:bold;
font-size:13px;
background-color:rgba(228, 236, 228, 0);
color:black;

}
QComboBox
{
text-align: center;
background-color: rgb(248, 249, 250);
}
QLineEdit
{
    background-color: rgb(250, 250, 250);
}
QTextEdit
{
    background-color:antiquewhite;
}

qss_read.py:

class QssRead:
    @staticmethod
    def readQSS(style):
        with open(style, "r") as f:
            return f.read()

本文含有隐藏内容,请 开通VIP 后查看

网站公告

今日签到

点亮在社区的每一天
去签到