#!/usr/bin/env python
# _*_ coding:utf-8 _*_
# @FileName :${FILE_NAME}
# @Time :${DATE} ${TIME}
# @Author :ZJL
import sys
import time
import datetime
from pathlib import Path
import pandas as pd
from PyQt6 import QtCore
from PyQt6.QtWidgets import QApplication, QMainWindow, QStyleFactory, QFileDialog
import serial
import serial.tools.list_ports
from GUI import Ui_MainWindow
class MainForm(QMainWindow, Ui_MainWindow): #创建窗体类,括号中是父类
def __init__(self, parent=None): #定义初始化函数
super(MainForm, self).__init__(parent)
self.setupUi(self) #调用GUI中Ui_MainWindow类函数setupUi
QApplication.setStyle(QStyleFactory.create('Fusion')) #设置窗口风格为Fusion
timer = QtCore.QTimer(self) # 创建1个 QTimer计时器对象
timer.timeout.connect(self.showtime) # 每隔1秒发射timeout信号,与自定义槽函数关联
timer.start(1000) # 启动计时器,时间间隔1秒
self.pushButton_opencom.clicked.connect(self.opencomEvent) #点击打开串口按钮执行startevent
self.pushButton_closecom.clicked.connect(self.closecomEvent) ##点击关闭串口按钮执行stopevent
self.pushButton_senddata.clicked.connect(self.send_recdataEvent) #点击发送数据按钮执行senddataevent
self.pushButton_clear.clicked.connect(self.clearEvent) #点击清空显示按钮执行clear
#self.radioButton_rec16.toggled.connect(self.rec16Event) #显示栏16进制显示
self.pushButton_openfile.clicked.connect(self.showfileDialog) #打开文件对话框
self.pushButton_sendfile.clicked.connect(self.sendfileEvent) #发送文件数据
self.ser = serial.Serial() #创建一个串口号对象
self.serport = MainForm.serial_port(self) #读取电脑设备串口号
self.comboBox_com.addItems(self.serport)
self.senddata_num = 0 #发送数据量
self.rec_data_num = 0 #收到数据量
def showtime(self): # 自定义槽函数,用来在状态栏中显示当前日期时间
datetime = QtCore.QDateTime.currentDateTime() # 获取当前日期时间
text = datetime.toString('yyyy-MM-dd HH:mm:ss') # 格式化日期时间
self.TimeLCD.display(text) # 在TimeLCD中显示日期时间
def opencomEvent(self): #槽函数-打开串口
port = self.comboBox_com.currentText() # 串口号
baudrate = int(self.comboBox_baud.currentText()) # 波特率
bytesize = int(self.comboBox_bytesize.currentText()) #字节数
parity = self.comboBox_parity.currentText() #奇偶校验
stopbits = float(self.comboBox_stopbits.currentText()) #停止位
self.ser = serial.Serial(port, baudrate, bytesize, parity, stopbits, timeout=1) #打开串口
if self.ser.isOpen():
self.textBrowser_sta.setText("串口打开成功")
else:
self.textBrowser_sta.setText("串口打开失败")
def send_recdataEvent(self): #发送数据事件
send_data = self.textEdit_send.toPlainText() # 获取textEdit_send中的字符串数据
send_data_bytes = bytes.fromhex(send_data) # 十六进制字符串转换成字节数据
if self.radioButton_sendHEX.isChecked() == True:
self.ser.write(send_data_bytes) # 向串口发送数据
self.senddata_num = self.senddata_num + len(send_data_bytes)
self.senddata_num_str = str(self.senddata_num)
self.label_send.setText(self.senddata_num_str)
time.sleep(0.1) # 延时0.1秒
rec_data = self.ser.readline() # 从串口读取一行数据
self.rec_data_num = self.rec_data_num + len(rec_data)
self.rec_data_num_str = str(self.rec_data_num)
self.label_rec.setText(self.rec_data_num_str)
rec_data_str = rec_data.decode('utf-8')
current_time = datetime.datetime.now()
time_str = current_time.strftime("%Y-%m-%d %H:%M:%S")
rec_data_strmerge = time_str + ': ' + rec_data_str
self.textBrowser_rec.append(rec_data_strmerge) # 读取的数据添加到接收栏中
self.textBrowser_sta.setText("数据发送成功")
else:
send_data_str = send_data.encode('utf-8')
self.ser.write(send_data_str) # 向串口发送数据
self.senddata_num = self.senddata_num + len(send_data_str)
self.senddata_num_str = str(self.senddata_num)
self.label_send.setText(self.senddata_num_str)
time.sleep(0.1) # 延时0.1秒
rec_data = self.ser.readline() # 从串口读取一行数据
self.rec_data_num = self.rec_data_num + len(rec_data)
self.rec_data_num_str = str(self.rec_data_num)
self.label_rec.setText(self.rec_data_num_str)
rec_data_str = rec_data.decode('utf-8')
current_time = datetime.datetime.now()
time_str = current_time.strftime("%Y-%m-%d %H:%M:%S")
rec_data_strmerge = time_str + ': ' + rec_data_str
self.textBrowser_rec.append(rec_data_strmerge) # 读取的数据添加到接收栏中
self.textBrowser_sta.setText("数据发送成功")
def closecomEvent(self): #槽函数-关闭串口
self.ser.close() #关闭串口
if self.ser.isOpen(): #更新状态栏信息
self.textBrowser_sta.setText("串口关闭失败")
else:
self.textBrowser_sta.setText("串口关闭成功")
def clearEvent(self): #清除接收框
self.textBrowser_rec.clear()
self.textBrowser_sta.setText("清除接收框")
def rec16Event(self): #
data = self.textBrowser_rec.toPlainText()
if self.radioButton_recHEX.isChecked() == True: #根据radioButton_rec16的值决定发送数据的类型
data_hex = data.encode('utf-8')
#data_hex_str = str(data_hex)
self.textBrowser_rec.setText(data_hex)
else:
data_dec = data
self.textBrowser_rec.setText(data_dec)
def showfileDialog(self): #打开文件对话框
self.textBrowser_sta.setText("打开文件对话框")
home_dir = str(Path.home())
fname = QFileDialog.getOpenFileName(self, '打开文件', home_dir)
if fname[0]:
f = open(fname[0], 'r')
with f:
data = f.read()
self.textEdit_send.setPlainText(data)
def sendfileEvent(self):
send_filedata = self.textEdit_send.toPlainText()
send_data_bytes = bytes.fromhex(send_filedata) # 十六进制字符串转换成字节数据
self.textBrowser_sta.setText("发送文件数据")
self.ser.write(send_data_bytes) # 向串口发送数据
self.senddata_num = self.senddata_num + len(send_data_bytes)
self.senddata_num_str = str(self.senddata_num)
self.label_send.setText(self.senddata_num_str)
time.sleep(0.1) # 延时0.1秒
rec_data = self.ser.readline() # 从串口读取一行数据
self.rec_data_num = self.rec_data_num + len(rec_data)
self.rec_data_num_str = str(self.rec_data_num)
self.label_rec.setText(self.rec_data_num_str)
rec_data_str = rec_data.decode('utf-8')
current_time = datetime.datetime.now()
time_str = current_time.strftime("%Y-%m-%d %H:%M:%S")
rec_data_strmerge = time_str + ': ' + rec_data_str
self.textBrowser_rec.append(rec_data_strmerge) # 读取的数据添加到接收栏中
self.textBrowser_sta.setText("数据发送成功")
def serial_port(self): #获取电脑设备串口号
port_list = []
portlist = list(serial.tools.list_ports.comports())
for port in portlist:
port_list.append(port.device)
return port_list
"""
主函数,从这里开始运行
"""
if __name__ == '__main__':
app = QApplication(sys.argv) #创建应用程序,接收命令行参数列表
MF = MainForm() #实例化MyMainForm类,创建主窗体实体类
MF.show() #显示主窗体
sys.exit(app.exec()) #程序结束后释放资源
main.py`# Form implementation generated from reading ui file ‘GUI.ui’
Created by: PyQt6 UI code generator 6.6.1
WARNING: Any manual changes made to this file will be lost when pyuic6 is
run again. Do not edit this file unless you know what you are doing.
from PyQt6 import QtCore, QtGui, QtWidgets
class Ui_MainWindow(object):
def setupUi(self, MainWindow):
MainWindow.setObjectName(“MainWindow”)
MainWindow.resize(803, 674)
self.centralwidget = QtWidgets.QWidget(parent=MainWindow)
self.centralwidget.setObjectName(“centralwidget”)
self.textBrowser_rec = QtWidgets.QTextBrowser(parent=self.centralwidget)
self.textBrowser_rec.setGeometry(QtCore.QRect(10, 20, 490, 240))
self.textBrowser_rec.setObjectName(“textBrowser_rec”)
self.textEdit_send = QtWidgets.QTextEdit(parent=self.centralwidget)
self.textEdit_send.setGeometry(QtCore.QRect(10, 290, 490, 240))
self.textEdit_send.setObjectName(“textEdit_send”)
self.comboBox_com = QtWidgets.QComboBox(parent=self.centralwidget)
self.comboBox_com.setGeometry(QtCore.QRect(570, 292, 100, 21))
self.comboBox_com.setEditable(True)
self.comboBox_com.setCurrentText(“”)
self.comboBox_com.setObjectName(“comboBox_com”)
self.label_send = QtWidgets.QLabel(parent=self.centralwidget)
self.label_send.setGeometry(QtCore.QRect(515, 150, 54, 16))
self.label_send.setObjectName(“label_send”)
self.label_rec = QtWidgets.QLabel(parent=self.centralwidget)
self.label_rec.setGeometry(QtCore.QRect(575, 150, 54, 16))
self.label_rec.setObjectName(“label_rec”)
self.TimeLCD = QtWidgets.QLCDNumber(parent=self.centralwidget)
self.TimeLCD.setGeometry(QtCore.QRect(510, 20, 290, 31))
self.TimeLCD.setDigitCount(19)
self.TimeLCD.setObjectName(“TimeLCD”)
self.pushButton_clearrec = QtWidgets.QPushButton(parent=self.centralwidget)
self.pushButton_clearrec.setGeometry(QtCore.QRect(510, 80, 120, 40))
self.pushButton_clearrec.setObjectName(“pushButton_clearrec”)
self.radioButton_recHEX = QtWidgets.QRadioButton(parent=self.centralwidget)
self.radioButton_recHEX.setGeometry(QtCore.QRect(510, 60, 91, 20))
self.radioButton_recHEX.setChecked(False)
self.radioButton_recHEX.setObjectName(“radioButton_recHEX”)
self.pushButton_opencom = QtWidgets.QPushButton(parent=self.centralwidget)
self.pushButton_opencom.setGeometry(QtCore.QRect(680, 340, 120, 40))
self.pushButton_opencom.setObjectName(“pushButton_opencom”)
self.pushButton_closecom = QtWidgets.QPushButton(parent=self.centralwidget)
self.pushButton_closecom.setGeometry(QtCore.QRect(680, 390, 120, 40))
self.pushButton_closecom.setObjectName(“pushButton_closecom”)
self.pushButton_senddata = QtWidgets.QPushButton(parent=self.centralwidget)
self.pushButton_senddata.setGeometry(QtCore.QRect(680, 460, 120, 40))
self.pushButton_senddata.setObjectName(“pushButton_senddata”)
self.pushButton_openfile = QtWidgets.QPushButton(parent=self.centralwidget)
self.pushButton_openfile.setGeometry(QtCore.QRect(510, 170, 120, 40))
self.pushButton_openfile.setObjectName(“pushButton_openfile”)
self.pushButton_sendfile = QtWidgets.QPushButton(parent=self.centralwidget)
self.pushButton_sendfile.setGeometry(QtCore.QRect(510, 220, 120, 40))
self.pushButton_sendfile.setObjectName(“pushButton_sendfile”)
self.label_4 = QtWidgets.QLabel(parent=self.centralwidget)
self.label_4.setGeometry(QtCore.QRect(510, 130, 54, 16))
self.label_4.setObjectName(“label_4”)
self.label_5 = QtWidgets.QLabel(parent=self.centralwidget)
self.label_5.setGeometry(QtCore.QRect(570, 130, 54, 16))
self.label_5.setObjectName(“label_5”)
self.textBrowser_sta = QtWidgets.QTextBrowser(parent=self.centralwidget)
self.textBrowser_sta.setGeometry(QtCore.QRect(510, 500, 290, 31))
self.textBrowser_sta.setObjectName(“textBrowser_sta”)
self.label = QtWidgets.QLabel(parent=self.centralwidget)
self.label.setGeometry(QtCore.QRect(510, 294, 54, 16))
self.label.setObjectName(“label”)
self.label_2 = QtWidgets.QLabel(parent=self.centralwidget)
self.label_2.setGeometry(QtCore.QRect(510, 321, 54, 16))
self.label_2.setObjectName(“label_2”)
self.label_3 = QtWidgets.QLabel(parent=self.centralwidget)
self.label_3.setGeometry(QtCore.QRect(510, 348, 54, 16))
self.label_3.setObjectName(“label_3”)
self.label_6 = QtWidgets.QLabel(parent=self.centralwidget)
self.label_6.setGeometry(QtCore.QRect(510, 375, 54, 16))
self.label_6.setObjectName(“label_6”)
self.label_7 = QtWidgets.QLabel(parent=self.centralwidget)
self.label_7.setGeometry(QtCore.QRect(510, 402, 54, 16))
self.label_7.setObjectName(“label_7”)
self.label_8 = QtWidgets.QLabel(parent=self.centralwidget)
self.label_8.setGeometry(QtCore.QRect(510, 430, 54, 16))
self.label_8.setObjectName(“label_8”)
self.label_9 = QtWidgets.QLabel(parent=self.centralwidget)
self.label_9.setGeometry(QtCore.QRect(10, 270, 54, 16))
self.label_9.setObjectName(“label_9”)
self.label_10 = QtWidgets.QLabel(parent=self.centralwidget)
self.label_10.setGeometry(QtCore.QRect(10, 0, 54, 16))
self.label_10.setObjectName(“label_10”)
self.comboBox_bytesize = QtWidgets.QComboBox(parent=self.centralwidget)
self.comboBox_bytesize.setGeometry(QtCore.QRect(570, 346, 100, 21))
self.comboBox_bytesize.setEditable(True)
self.comboBox_bytesize.setObjectName(“comboBox_bytesize”)
self.comboBox_bytesize.addItem(“”)
self.comboBox_bytesize.addItem(“”)
self.comboBox_bytesize.addItem(“”)
self.comboBox_bytesize.addItem(“”)
self.comboBox_parity = QtWidgets.QComboBox(parent=self.centralwidget)
self.comboBox_parity.setGeometry(QtCore.QRect(570, 373, 100, 21))
self.comboBox_parity.setEditable(True)
self.comboBox_parity.setObjectName(“comboBox_parity”)
self.comboBox_parity.addItem(“”)
self.comboBox_parity.addItem(“”)
self.comboBox_parity.addItem(“”)
self.comboBox_parity.addItem(“”)
self.comboBox_parity.addItem(“”)
self.comboBox_baud = QtWidgets.QComboBox(parent=self.centralwidget)
self.comboBox_baud.setGeometry(QtCore.QRect(570, 319, 100, 21))
self.comboBox_baud.setEditable(True)
self.comboBox_baud.setMaxCount(2147483646)
self.comboBox_baud.setObjectName(“comboBox_baud”)
self.comboBox_baud.addItem(“”)
self.comboBox_baud.addItem(“”)
self.comboBox_baud.addItem(“”)
self.comboBox_baud.addItem(“”)
self.comboBox_baud.addItem(“”)
self.comboBox_baud.addItem(“”)
self.comboBox_baud.addItem(“”)
self.comboBox_baud.addItem(“”)
self.comboBox_baud.addItem(“”)
self.comboBox_baud.addItem(“”)
self.comboBox_baud.addItem(“”)
self.comboBox_baud.addItem(“”)
self.comboBox_stopbits = QtWidgets.QComboBox(parent=self.centralwidget)
self.comboBox_stopbits.setGeometry(QtCore.QRect(570, 400, 100, 21))
self.comboBox_stopbits.setEditable(True)
self.comboBox_stopbits.setObjectName(“comboBox_stopbits”)
self.comboBox_stopbits.addItem(“”)
self.comboBox_stopbits.addItem(“”)
self.comboBox_stopbits.addItem(“”)
self.comboBox_flow = QtWidgets.QComboBox(parent=self.centralwidget)
self.comboBox_flow.setGeometry(QtCore.QRect(570, 427, 100, 21))
self.comboBox_flow.setEditable(True)
self.comboBox_flow.setObjectName(“comboBox_flow”)
self.comboBox_flow.addItem(“”)
self.radioButton_sendHEX = QtWidgets.QRadioButton(parent=self.centralwidget)
self.radioButton_sendHEX.setGeometry(QtCore.QRect(680, 440, 81, 20))
self.radioButton_sendHEX.setCheckable(True)
self.radioButton_sendHEX.setChecked(True)
self.radioButton_sendHEX.setAutoExclusive(False)
self.radioButton_sendHEX.setObjectName(“radioButton_sendHEX”)
self.pushButton_checkcom = QtWidgets.QPushButton(parent=self.centralwidget)
self.pushButton_checkcom.setGeometry(QtCore.QRect(680, 290, 120, 40))
self.pushButton_checkcom.setObjectName(“pushButton_checkcom”)
self.pushButton_clearsend = QtWidgets.QPushButton(parent=self.centralwidget)
self.pushButton_clearsend.setGeometry(QtCore.QRect(510, 460, 161, 40))
self.pushButton_clearsend.setObjectName(“pushButton_clearsend”)
MainWindow.setCentralWidget(self.centralwidget)
self.menubar = QtWidgets.QMenuBar(parent=MainWindow)
self.menubar.setGeometry(QtCore.QRect(0, 0, 803, 22))
self.menubar.setObjectName(“menubar”)
MainWindow.setMenuBar(self.menubar)
self.statusbar = QtWidgets.QStatusBar(parent=MainWindow)
self.statusbar.setObjectName(“statusbar”)
MainWindow.setStatusBar(self.statusbar)
self.retranslateUi(MainWindow)
self.comboBox_baud.setCurrentIndex(6)
QtCore.QMetaObject.connectSlotsByName(MainWindow)
def retranslateUi(self, MainWindow):
_translate = QtCore.QCoreApplication.translate
MainWindow.setWindowTitle(_translate("MainWindow", "串口调试助手V1.0.1 ---BY ZJL"))
self.label_send.setText(_translate("MainWindow", "0"))
self.label_rec.setText(_translate("MainWindow", "0"))
self.pushButton_clearrec.setText(_translate("MainWindow", "清空显示"))
self.radioButton_recHEX.setText(_translate("MainWindow", "HEX显示"))
self.pushButton_opencom.setText(_translate("MainWindow", "打开串口"))
self.pushButton_closecom.setText(_translate("MainWindow", "关闭串口"))
self.pushButton_senddata.setText(_translate("MainWindow", "发送数据"))
self.pushButton_openfile.setText(_translate("MainWindow", "打开文件"))
self.pushButton_sendfile.setText(_translate("MainWindow", "发送文件"))
self.label_4.setText(_translate("MainWindow", "发送"))
self.label_5.setText(_translate("MainWindow", "接收"))
self.label.setText(_translate("MainWindow", "串口号"))
self.label_2.setText(_translate("MainWindow", "波特率"))
self.label_3.setText(_translate("MainWindow", "数据位"))
self.label_6.setText(_translate("MainWindow", "校验位"))
self.label_7.setText(_translate("MainWindow", "停止位"))
self.label_8.setText(_translate("MainWindow", "流控制"))
self.label_9.setText(_translate("MainWindow", "发送区"))
self.label_10.setText(_translate("MainWindow", "接收区"))
self.comboBox_bytesize.setItemText(0, _translate("MainWindow", "8"))
self.comboBox_bytesize.setItemText(1, _translate("MainWindow", "7"))
self.comboBox_bytesize.setItemText(2, _translate("MainWindow", "6"))
self.comboBox_bytesize.setItemText(3, _translate("MainWindow", "5"))
self.comboBox_parity.setItemText(0, _translate("MainWindow", "N"))
self.comboBox_parity.setItemText(1, _translate("MainWindow", "O"))
self.comboBox_parity.setItemText(2, _translate("MainWindow", "E"))
self.comboBox_parity.setItemText(3, _translate("MainWindow", "M"))
self.comboBox_parity.setItemText(4, _translate("MainWindow", "S"))
self.comboBox_baud.setCurrentText(_translate("MainWindow", "9600"))
self.comboBox_baud.setItemText(0, _translate("MainWindow", "600"))
self.comboBox_baud.setItemText(1, _translate("MainWindow", "1200"))
self.comboBox_baud.setItemText(2, _translate("MainWindow", "1800"))
self.comboBox_baud.setItemText(3, _translate("MainWindow", "2400"))
self.comboBox_baud.setItemText(4, _translate("MainWindow", "4800"))
self.comboBox_baud.setItemText(5, _translate("MainWindow", "7200"))
self.comboBox_baud.setItemText(6, _translate("MainWindow", "9600"))
self.comboBox_baud.setItemText(7, _translate("MainWindow", "14400"))
self.comboBox_baud.setItemText(8, _translate("MainWindow", "19200"))
self.comboBox_baud.setItemText(9, _translate("MainWindow", "115200"))
self.comboBox_baud.setItemText(10, _translate("MainWindow", "128000"))
self.comboBox_baud.setItemText(11, _translate("MainWindow", "230400"))
self.comboBox_stopbits.setItemText(0, _translate("MainWindow", "1.0"))
self.comboBox_stopbits.setItemText(1, _translate("MainWindow", "1.5"))
self.comboBox_stopbits.setItemText(2, _translate("MainWindow", "2.0"))
self.comboBox_flow.setItemText(0, _translate("MainWindow", "无"))
self.radioButton_sendHEX.setText(_translate("MainWindow", "HEX发送"))
self.pushButton_checkcom.setText(_translate("MainWindow", "检测串口"))
self.pushButton_clearsend.setText(_translate("MainWindow", "清空发送"))