基于PyQt6编写一个串口调试助手

 更新时间:2024年12月27日 11:18:27   作者:小灰灰搞电子  
这篇文章主要为大家详细介绍了如何基于PyQt6编写一个串口调试助手,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下

一、界面预览

二、实现源码

# -*- coding: utf-8 -*-

# Form implementation generated from reading ui file 'untitled.ui'
#
# Created by: PyQt5 UI code generator 5.15.4
#
# WARNING: Any manual changes made to this file will be lost when pyuic5 is
# run again.  Do not edit this file unless you know what you are doing.


from PyQt6 import QtCore, QtGui, QtWidgets
from PyQt6 import QtSerialPort
import PyQt6
from PyQt6.QtCore import QIODevice,QIODeviceBase
from PyQt6.QtCore import QDate, QTime, QDateTime, Qt

class Ui_Form(object):

    def setupUi(self, Form):
        Form.setObjectName("Form")
        Form.resize(791, 627)
        self.form = Form

        self.gridLayout_3 = QtWidgets.QGridLayout(Form)
        self.gridLayout_3.setObjectName("gridLayout_3")
        self.verticalLayout_3 = QtWidgets.QVBoxLayout()
        self.verticalLayout_3.setObjectName("verticalLayout_3")
        self.horizontalLayout_4 = QtWidgets.QHBoxLayout()
        self.horizontalLayout_4.setObjectName("horizontalLayout_4")
        self.groupBox_2 = QtWidgets.QGroupBox(Form)
        self.groupBox_2.setObjectName("groupBox_2")
        self.gridLayout_4 = QtWidgets.QGridLayout(self.groupBox_2)
        self.gridLayout_4.setObjectName("gridLayout_4")
        self.textBrowser = QtWidgets.QTextBrowser(self.groupBox_2)
        self.textBrowser.setObjectName("textBrowser")
        self.gridLayout_4.addWidget(self.textBrowser, 0, 0, 1, 1)
        self.horizontalLayout_4.addWidget(self.groupBox_2)
        self.groupBox = QtWidgets.QGroupBox(Form)
        self.groupBox.setObjectName("groupBox")
        self.gridLayout = QtWidgets.QGridLayout(self.groupBox)
        self.gridLayout.setObjectName("gridLayout")
        self.horizontalLayout_2 = QtWidgets.QHBoxLayout()
        self.horizontalLayout_2.setObjectName("horizontalLayout_2")
        self.label_2 = QtWidgets.QLabel(self.groupBox)
        self.label_2.setObjectName("label_2")
        self.horizontalLayout_2.addWidget(self.label_2)
        self.comboBoxBaudrate = QtWidgets.QComboBox(self.groupBox)
        self.comboBoxBaudrate.setObjectName("comboBoxBaudrate")
        self.horizontalLayout_2.addWidget(self.comboBoxBaudrate)
        self.horizontalLayout_2.setStretch(0, 1)
        self.horizontalLayout_2.setStretch(1, 3)
        self.gridLayout.addLayout(self.horizontalLayout_2, 1, 0, 1, 1)
        self.horizontalLayout = QtWidgets.QHBoxLayout()
        self.horizontalLayout.setObjectName("horizontalLayout")
        self.label = QtWidgets.QLabel(self.groupBox)
        self.label.setObjectName("label")
        self.horizontalLayout.addWidget(self.label)
        self.comboBoxSerialPort = QtWidgets.QComboBox(self.groupBox)
        self.comboBoxSerialPort.setObjectName("comboBoxSerialPort")
        self.horizontalLayout.addWidget(self.comboBoxSerialPort)
        self.horizontalLayout.setStretch(0, 1)
        self.horizontalLayout.setStretch(1, 3)
        self.gridLayout.addLayout(self.horizontalLayout, 0, 0, 1, 1)
        self.horizontalLayout_3 = QtWidgets.QHBoxLayout()
        self.horizontalLayout_3.setObjectName("horizontalLayout_3")
        self.label_3 = QtWidgets.QLabel(self.groupBox)
        self.label_3.setObjectName("label_3")
        self.horizontalLayout_3.addWidget(self.label_3)
        self.btnOpenClose = QtWidgets.QPushButton(self.groupBox)
        self.btnOpenClose.setObjectName("btnOpenClose")
        self.horizontalLayout_3.addWidget(self.btnOpenClose)
        self.horizontalLayout_3.setStretch(0, 1)
        self.horizontalLayout_3.setStretch(1, 3)
        self.gridLayout.addLayout(self.horizontalLayout_3, 2, 0, 1, 1)
        spacerItem = QtWidgets.QSpacerItem(20, 40, QtWidgets.QSizePolicy.Policy.Minimum, QtWidgets.QSizePolicy.Policy.Expanding)
        self.gridLayout.addItem(spacerItem, 3, 0, 1, 1)
        self.horizontalLayout_4.addWidget(self.groupBox)
        self.horizontalLayout_4.setStretch(0, 5)
        self.horizontalLayout_4.setStretch(1, 3)
        self.verticalLayout_3.addLayout(self.horizontalLayout_4)
        self.groupBox_3 = QtWidgets.QGroupBox(Form)
        self.groupBox_3.setObjectName("groupBox_3")
        self.gridLayout_2 = QtWidgets.QGridLayout(self.groupBox_3)
        self.gridLayout_2.setObjectName("gridLayout_2")
        self.horizontalLayout_5 = QtWidgets.QHBoxLayout()
        self.horizontalLayout_5.setObjectName("horizontalLayout_5")
        self.textEdit = QtWidgets.QTextEdit(self.groupBox_3)
        self.textEdit.setObjectName("textEdit")
        self.horizontalLayout_5.addWidget(self.textEdit)
        self.verticalLayout = QtWidgets.QVBoxLayout()
        self.verticalLayout.setObjectName("verticalLayout")
        self.btnSend = QtWidgets.QPushButton(self.groupBox_3)
        self.btnSend.setMinimumSize(QtCore.QSize(0, 50))
        self.btnSend.setObjectName("btnSend")
        self.verticalLayout.addWidget(self.btnSend)
        self.btnClear = QtWidgets.QPushButton(self.groupBox_3)
        self.btnClear.setMinimumSize(QtCore.QSize(0, 50))
        self.btnClear.setObjectName("btnClear")
        self.verticalLayout.addWidget(self.btnClear)
        self.horizontalLayout_5.addLayout(self.verticalLayout)
        self.horizontalLayout_5.setStretch(0, 5)
        self.horizontalLayout_5.setStretch(1, 1)
        self.gridLayout_2.addLayout(self.horizontalLayout_5, 0, 0, 1, 1)
        self.verticalLayout_3.addWidget(self.groupBox_3)
        self.verticalLayout_3.setStretch(0, 4)
        self.verticalLayout_3.setStretch(1, 2)
        self.gridLayout_3.addLayout(self.verticalLayout_3, 0, 0, 1, 1)

        self.textBrowser.setLineWrapMode(QtWidgets.QTextBrowser.LineWrapMode.WidgetWidth)
        self.paraInit()

        self.retranslateUi(Form)
        QtCore.QMetaObject.connectSlotsByName(Form)
    def paraInit(self):
        availablePorts = QtSerialPort.QSerialPortInfo.availablePorts()
        self.comboBoxSerialPort.clear()
        for port in availablePorts:
            self.comboBoxSerialPort.addItem(port.portName())

        # 初始化波特率
        baudrates = QtSerialPort.QSerialPortInfo.standardBaudRates()
        self.comboBoxBaudrate.clear()
        for i in baudrates:
            self.comboBoxBaudrate.addItem(str(i))

        self.serial = QtSerialPort.QSerialPort()
        #连接信号与槽
        self.btnOpenClose.clicked.connect(self.btnOpenCloseClick)
        self.btnSend.clicked.connect(self.btnSendClick)
        self.btnClear.clicked.connect(self.btnClearClick)
        self.serial.readyRead.connect(self.serialReadyRead)
    def btnOpenCloseClick(self):
        if(self.serial.isOpen()):
            print("关闭串口")
            self.btnOpenClose.setText("打开串口")
            self.serial.close()
            self.comboBoxBaudrate.setEnabled(True)
            self.comboBoxSerialPort.setEnabled(True)
        else:
            print("打开串口")
            self.serial.setPortName(self.comboBoxSerialPort.currentText())
            self.serial.setBaudRate(int(self.comboBoxBaudrate.currentText()))
            self.serial.setDataBits(QtSerialPort.QSerialPort.DataBits.Data8)
            self.serial.setParity(QtSerialPort.QSerialPort.Parity.NoParity)
            self.serial.setStopBits(QtSerialPort.QSerialPort.StopBits.OneStop)
            self.serial.setFlowControl(QtSerialPort.QSerialPort.FlowControl.NoFlowControl)
            print(self.serial.portName())
            print(self.serial.baudRate())
            if(self.serial.open(QIODeviceBase.OpenModeFlag.ReadWrite)):
                self.btnOpenClose.setText("关闭串口")
                self.comboBoxBaudrate.setEnabled(False)
                self.comboBoxSerialPort.setEnabled(False)
            else:
                QtWidgets.QMessageBox.critical(self.form,"错误","打开串口失败:"+self.serial.errorString())




    def btnSendClick(self):
        text = self.textEdit.toPlainText()
        textByte = text.encode("UTF-8")
        self.serial.write(textByte)
    def btnClearClick(self):
        self.textEdit.clear()
    def serialReadyRead(self):
        buffer = self.serial.read(1024)
        buffer = buffer.decode("UTF-8")
        time = QDateTime.currentDateTime().toString("yyyy-MM-dd hh:mm:ss  ")
        # self.textBrowser.append(time+buffer)

        self.textBrowser.setHorizontalScrollBarPolicy(Qt.ScrollBarPolicy.ScrollBarAlwaysOff)
        tc = self.textBrowser.textCursor()
        tc.movePosition(QtGui.QTextCursor.MoveOperation.End)
        tc.insertText(time+buffer)


    def retranslateUi(self, Form):
        _translate = QtCore.QCoreApplication.translate
        Form.setWindowTitle(_translate("Form", "Form"))
        self.groupBox_2.setTitle(_translate("Form", "GroupBox"))
        self.groupBox.setTitle(_translate("Form", "GroupBox"))
        self.label_2.setText(_translate("Form", "波特率  :"))
        self.label.setText(_translate("Form", "串口选择:"))
        self.label_3.setText(_translate("Form", "串口操作:"))
        self.btnOpenClose.setText(_translate("Form", "打开串口"))
        self.groupBox_3.setTitle(_translate("Form", "GroupBox"))
        self.btnSend.setText(_translate("Form", "发送"))
        self.btnClear.setText(_translate("Form", "清空"))


if __name__ == '__main__':
    import sys
    app = QtWidgets.QApplication(sys.argv)
    mainWindow = QtWidgets.QWidget()

    ui = Ui_Form()  # 这个是类名,名字根据自定义的情况变化
    ui.setupUi(mainWindow)
    mainWindow.setWindowTitle("串口调试助手")
    mainWindow.show()
    sys.exit(app.exec())

三、需要的软件包

到此这篇关于基于PyQt6编写一个串口调试助手的文章就介绍到这了,更多相关PyQt6串口调试内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 教你利用python的matplotlib(pyplot)绘制折线图和柱状图

    教你利用python的matplotlib(pyplot)绘制折线图和柱状图

    Python绘图需要下载安装matplotlib模块,它是一个数学绘图库,我们将使用它来制作简单的图表,如折线图和散点图,下面这篇文章主要给大家介绍了关于利用python的matplotlib(pyplot)绘制折线图和柱状图的相关资料,需要的朋友可以参考下
    2022-05-05
  • python3 小数位的四舍五入(用两种方法解决round 遇5不进)

    python3 小数位的四舍五入(用两种方法解决round 遇5不进)

    这篇文章主要介绍了python3 小数位的四舍五入(用两种方法解决round 遇5不进),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-04-04
  • Python pip安装第三方库的攻略分享

    Python pip安装第三方库的攻略分享

    pip 就是 Python 标准库(The Python Standard Library)中的一个包,只是这个包比较特殊,用它可以来管理 Python 标准库(The Python Standard Library)中其他的包。本文为大家介绍了pip安装第三方库的方法,需要的可以参考一下
    2022-11-11
  • 详解Python列表赋值复制深拷贝及5种浅拷贝

    详解Python列表赋值复制深拷贝及5种浅拷贝

    这篇文章主要介绍了Python列表赋值,复制,深拷贝以及5种浅拷贝详解,本文给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2019-05-05
  • 使用Python生成新春烟花效果的方法

    使用Python生成新春烟花效果的方法

    新春佳节到来之际,烟花的璀璨绽放象征着喜庆和热闹,如果能通过代码在屏幕上生成烟花效果,既能增加节日的趣味,也能加深对编程的理解,本篇博客将详细介绍如何使用Python生成新春烟花效果,包括实现原理、代码解析以及常见问题的解决方案,需要的朋友可以参考下
    2025-01-01
  • Python使用PyAutoGUI实现桌面自动化的实战指南

    Python使用PyAutoGUI实现桌面自动化的实战指南

    在现代办公和开发环境中,我们常常被大量重复性的桌面操作所困扰,本文主要和大家详细介绍一下Python如何使用PyAutoGUI实现桌面自动化功能,感兴趣的小伙伴可以了解下
    2026-01-01
  • python http通信接口开发示例

    python http通信接口开发示例

    本文主要介绍了python http通信接口开发示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-04-04
  • python实现简单的飞机大战

    python实现简单的飞机大战

    这篇文章主要为大家详细介绍了python实现简单的飞机大战,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-05-05
  • Python匿名函数/排序函数/过滤函数/映射函数/递归/二分法

    Python匿名函数/排序函数/过滤函数/映射函数/递归/二分法

    这篇文章主要介绍了Python匿名函数/排序函数/过滤函数/映射函数/递归/二分法 ,本文通过实例代码给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2019-06-06
  • Python中win32包的安装及常见用途介绍

    Python中win32包的安装及常见用途介绍

    在Windows环境下,Python Win32模块通常随Python安装包一起安装,这篇文章主要介绍了Python中win32包的安装及常见用途的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2025-06-06

最新评论