基于PyQt6編寫一個串口調(diào)試助手
更新時間:2024年12月27日 11:18:27 作者:小灰灰搞電子
這篇文章主要為大家詳細介紹了如何基于PyQt6編寫一個串口調(diào)試助手,文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起學習一下
一、界面預(yù)覽

二、實現(xiàn)源碼
# -*- 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("關(guān)閉串口")
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("關(guān)閉串口")
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", "發(fā)送"))
self.btnClear.setText(_translate("Form", "清空"))
if __name__ == '__main__':
import sys
app = QtWidgets.QApplication(sys.argv)
mainWindow = QtWidgets.QWidget()
ui = Ui_Form() # 這個是類名,名字根據(jù)自定義的情況變化
ui.setupUi(mainWindow)
mainWindow.setWindowTitle("串口調(diào)試助手")
mainWindow.show()
sys.exit(app.exec())三、需要的軟件包

到此這篇關(guān)于基于PyQt6編寫一個串口調(diào)試助手的文章就介紹到這了,更多相關(guān)PyQt6串口調(diào)試內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Django 多對多字段的更新和插入數(shù)據(jù)實例
這篇文章主要介紹了Django 多對多字段的更新和插入數(shù)據(jù)實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-03-03
Python實現(xiàn)返回數(shù)組中第i小元素的方法示例
這篇文章主要介紹了Python實現(xiàn)返回數(shù)組中第i小元素的方法,結(jié)合實例形式分析了Python針對數(shù)組的遍歷、排序、運算等相關(guān)操作技巧,需要的朋友可以參考下2017-12-12
Python實現(xiàn)普通圖片轉(zhuǎn)ico圖標的方法詳解
ICO是一種圖標文件格式,圖標文件可以存儲單個圖案、多尺寸、多色板的圖標文件。本文將利用Python實現(xiàn)普通圖片轉(zhuǎn)ico圖標,感興趣的小伙伴可以了解一下2022-11-11
Django Form設(shè)置文本框為readonly操作
這篇文章主要介紹了Django Form設(shè)置文本框為readonly操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-07-07
python用opencv將標注提取畫框到對應(yīng)的圖像中
這篇文章主要介紹了python用opencv將標注提取畫框到對應(yīng)的圖像中,文章圍繞主題展開詳細的內(nèi)容介紹,具有一定的參考價值,需要的小伙伴可以參考一下2022-08-08

