python编写串口调试助手

#!/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", "清空发送"))
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值