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 后查看