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", "清空发送"))
  • 6
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
### 回答1: Python Qt 串口调试助手是一个基于Python和Qt框架开发的串口调试工具,可以通过串口与外部设备进行通信和调试。它提供了一个清晰简单的界面,用户可以通过该界面进行串口的打开、关闭、设置波特率等操作,并能实时监控并显示串口接收到的数据。 这个工具的源码主要包含以下几个部分: 1. 界面设计:使用Qt Designer工具进行界面的设计,将设计好的界面保存为 .ui文件。然后使用 PyQt或者PySide库中的工具将 .ui文件转换成 Python可执行的代码。 2. 串口操作:利用 Python 的串口库,如 pySerial,实现串口的打开、关闭、设置波特率等操作。该部分代码负责与外部设备进行串口通信,并将接收到的数据传递给界面显示。 3. 事件处理:利用 Qt 框架提供的信号与槽机制,将界面上的各种操作(如按钮点击、串口参数设置等)与对应的函数进行绑定。当用户进行操作时,相应的事件函数会被触发,从而执行对应的操作。 4. 数据显示:通过 Qt 框架提供的文本框、列表框等控件,将串口接收到的数据实时显示在界面上。可以根据需求,对接收到的数据进行解析和处理,如格式化显示、存储到文件等。 开发这个工具需要有一定的Python编程和Qt框架的基础。可以通过学习相关的教程和文档来了解更多关于Python Qt 串口调试助手开发和使用。通过阅读源码,可以深入理解工具的实现原理,并根据需要进行二次开发和定制。 ### 回答2: Python Qt串口调试助手是一个用于调试串口通信的工具。它使用Python开发,并使用Qt图形界面库构建用户界面。以下是该工具的源码解析: 1. 导入所需的库: ``` import sys from PyQt5.QtWidgets import QApplication, QMainWindow, QPlainTextEdit from PyQt5.QtSerialPort import QSerialPort, QSerialPortInfo from PyQt5.QtCore import QIODevice ``` 2. 创建一个主窗口类,并继承QMainWindow: ``` class SerialAssistant(QMainWindow): def __init__(self): super().__init__() self.initUI() def initUI(self): # 设置窗口标题和大小 self.setWindowTitle("Python Qt串口调试助手") self.resize(800, 600) ``` 3. 在initUI方法中创建用户界面元素: ``` # 创建一个文本框用于显示串口信息和接收的数据 self.dataTextEdit = QPlainTextEdit(self) self.dataTextEdit.setReadOnly(True) # 创建一个串口实例 self.serial = QSerialPort(self) # 创建一个下拉菜单用于选择串口 self.serialPortComboBox = QComboBox(self) self.serialPortComboBox.currentIndexChanged.connect(self.openSerialPort) # 创建一个按钮用于打开和关闭串口 self.openCloseButton = QPushButton("打开串口", self) self.openCloseButton.clicked.connect(self.handleOpenCloseButton) # 布局管理 layout = QVBoxLayout() layout.addWidget(self.dataTextEdit) layout.addWidget(self.serialPortComboBox) layout.addWidget(self.openCloseButton) centralWidget = QWidget() centralWidget.setLayout(layout) self.setCentralWidget(centralWidget) ``` 4. 实现打开和关闭串口的方法: ``` def openSerialPort(self, index): # 关闭已经打开的串口 if self.serial.isOpen(): self.serial.close() # 获取选择的串口信息 portName = self.serialPortComboBox.itemData(index) # 打开选择的串口 self.serial.setPortName(portName) self.serial.setBaudRate(QSerialPort.Baud9600) self.serial.setDataBits(QSerialPort.Data8) self.serial.setParity(QSerialPort.NoParity) self.serial.setStopBits(QSerialPort.OneStop) self.serial.setFlowControl(QSerialPort.NoFlowControl) if self.serial.open(QIODevice.ReadWrite): self.openCloseButton.setText("关闭串口") else: self.openCloseButton.setText("打开串口") ``` 5. 实现处理打开和关闭串口按钮点击事件的方法: ``` def handleOpenCloseButton(self): if self.serial.isOpen(): self.serial.close() self.openCloseButton.setText("打开串口") else: self.openSerialPort(self.serialPortComboBox.currentIndex()) ``` 6. 实现串口数据接收的方法: ``` def handleReadyRead(self): while self.serial.bytesAvailable(): data = self.serial.readAll() self.dataTextEdit.appendPlainText(data) ``` 7. 编写主函数来创建应用程序实例,并运行: ``` if __name__ == "__main__": app = QApplication(sys.argv) serialAssistant = SerialAssistant() serialAssistant.show() sys.exit(app.exec_()) ``` 这就是Python Qt串口调试助手的源码,它可以帮助用户通过串口进行通信,并在图形界面上显示接收到的数据。用户可以选择串口,并通过打开和关闭按钮控制串口的状态。同时,它还提供了一个文本框用于显示串口信息和接收的数据。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值