串口调试小助手
This commit is contained in:
parent
23aae36c2a
commit
d8301f296a
7 changed files with 640 additions and 0 deletions
|
@ -6,6 +6,8 @@ encoding//\u5176\u5B83/QRC\u8D44\u6E90\u6587\u4EF6\u4F7F\u7528/qrctest1.py=utf-8
|
||||||
encoding//\u5176\u5B83/QRC\u8D44\u6E90\u6587\u4EF6\u4F7F\u7528/qrctest2.py=utf-8
|
encoding//\u5176\u5B83/QRC\u8D44\u6E90\u6587\u4EF6\u4F7F\u7528/qrctest2.py=utf-8
|
||||||
encoding//\u5176\u5B83/QRC\u8D44\u6E90\u6587\u4EF6\u4F7F\u7528/res_rc.py=utf-8
|
encoding//\u5176\u5B83/QRC\u8D44\u6E90\u6587\u4EF6\u4F7F\u7528/res_rc.py=utf-8
|
||||||
encoding//\u5176\u5B83/QRC\u8D44\u6E90\u6587\u4EF6\u4F7F\u7528/textread.py=utf-8
|
encoding//\u5176\u5B83/QRC\u8D44\u6E90\u6587\u4EF6\u4F7F\u7528/textread.py=utf-8
|
||||||
|
encoding//\u5176\u5B83/\u4E32\u53E3\u8C03\u8BD5\u5C0F\u52A9\u624B/UiSerialPort.py=utf-8
|
||||||
|
encoding//\u5176\u5B83/\u4E32\u53E3\u8C03\u8BD5\u5C0F\u52A9\u624B/\u4E32\u53E3\u8C03\u8BD5\u5C0F\u52A9\u624B.py=utf-8
|
||||||
encoding//\u5176\u5B83/\u4EBA\u8138\u63CF\u70B9\u68C0\u6D4B/OpencvWidget.py=utf-8
|
encoding//\u5176\u5B83/\u4EBA\u8138\u63CF\u70B9\u68C0\u6D4B/OpencvWidget.py=utf-8
|
||||||
encoding//\u5176\u5B83/\u5168\u5C40\u70ED\u952E/HotKey.py=utf-8
|
encoding//\u5176\u5B83/\u5168\u5C40\u70ED\u952E/HotKey.py=utf-8
|
||||||
encoding//\u5176\u5B83/\u53F3\u4E0B\u89D2\u5F39\u51FA\u6846/WindowNotify.py=utf-8
|
encoding//\u5176\u5B83/\u53F3\u4E0B\u89D2\u5F39\u51FA\u6846/WindowNotify.py=utf-8
|
||||||
|
|
|
@ -185,6 +185,7 @@
|
||||||
1. [右下角弹出框](其它/右下角弹出框)
|
1. [右下角弹出框](其它/右下角弹出框)
|
||||||
1. [消息提示](其它/消息提示)
|
1. [消息提示](其它/消息提示)
|
||||||
1. [字体测试](其它/字体测试)
|
1. [字体测试](其它/字体测试)
|
||||||
|
1. [串口调试小助手](其它/串口调试小助手)
|
||||||
|
|
||||||
# QQ群
|
# QQ群
|
||||||
|
|
||||||
|
|
14
其它/串口调试小助手/README.md
Normal file
14
其它/串口调试小助手/README.md
Normal file
|
@ -0,0 +1,14 @@
|
||||||
|
# 串口调试小助手
|
||||||
|
|
||||||
|
用`QSerialPort`写了个类似串口调试小助手的工具, 这个类的官方资料: http://doc.qt.io/qt-5/qserialport.html
|
||||||
|
|
||||||
|
1. 通过`QSerialPortInfo.availablePorts()` 获取所有可用的串口
|
||||||
|
1. `QSerialPort.setPortName` 设置串口名
|
||||||
|
1. `QSerialPort.setBaudRate` 设置波特率
|
||||||
|
1. `QSerialPort.setParity` 设置校验位
|
||||||
|
1. `QSerialPort.setDataBits` 设置数据位
|
||||||
|
1. `QSerialPort.setStopBits` 设置停止位
|
||||||
|
1. `QSerialPort.setFlowControl` 设置流控制
|
||||||
|
|
||||||
|
|
||||||
|
![截图](ScreenShot/串口调试小助手.gif)
|
BIN
其它/串口调试小助手/ScreenShot/串口调试小助手.gif
Normal file
BIN
其它/串口调试小助手/ScreenShot/串口调试小助手.gif
Normal file
Binary file not shown.
After Width: | Height: | Size: 1.1 MiB |
175
其它/串口调试小助手/UiSerialPort.py
Normal file
175
其它/串口调试小助手/UiSerialPort.py
Normal file
|
@ -0,0 +1,175 @@
|
||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
|
||||||
|
# Form implementation generated from reading ui file 'UiSerialPort.ui'
|
||||||
|
#
|
||||||
|
# Created by: PyQt5 UI code generator 5.10.1
|
||||||
|
#
|
||||||
|
# WARNING! All changes made in this file will be lost!
|
||||||
|
|
||||||
|
from PyQt5 import QtCore, QtGui, QtWidgets
|
||||||
|
|
||||||
|
class Ui_FormSerialPort(object):
|
||||||
|
def setupUi(self, FormSerialPort):
|
||||||
|
FormSerialPort.setObjectName("FormSerialPort")
|
||||||
|
FormSerialPort.resize(721, 597)
|
||||||
|
FormSerialPort.setStyleSheet("#labelStatus {\n"
|
||||||
|
" border-radius: 13px;\n"
|
||||||
|
" background-color: gray;\n"
|
||||||
|
"}\n"
|
||||||
|
"#labelStatus[isOn=\"true\"] {\n"
|
||||||
|
" background-color: green;\n"
|
||||||
|
"}")
|
||||||
|
self.gridLayout = QtWidgets.QGridLayout(FormSerialPort)
|
||||||
|
self.gridLayout.setObjectName("gridLayout")
|
||||||
|
self.groupBox = QtWidgets.QGroupBox(FormSerialPort)
|
||||||
|
self.groupBox.setTitle("")
|
||||||
|
self.groupBox.setObjectName("groupBox")
|
||||||
|
self.formLayout = QtWidgets.QFormLayout(self.groupBox)
|
||||||
|
self.formLayout.setLabelAlignment(QtCore.Qt.AlignCenter)
|
||||||
|
self.formLayout.setObjectName("formLayout")
|
||||||
|
self.label = QtWidgets.QLabel(self.groupBox)
|
||||||
|
self.label.setObjectName("label")
|
||||||
|
self.formLayout.setWidget(0, QtWidgets.QFormLayout.LabelRole, self.label)
|
||||||
|
self.comboBoxPort = QtWidgets.QComboBox(self.groupBox)
|
||||||
|
self.comboBoxPort.setObjectName("comboBoxPort")
|
||||||
|
self.formLayout.setWidget(0, QtWidgets.QFormLayout.FieldRole, self.comboBoxPort)
|
||||||
|
self.label_2 = QtWidgets.QLabel(self.groupBox)
|
||||||
|
self.label_2.setObjectName("label_2")
|
||||||
|
self.formLayout.setWidget(1, QtWidgets.QFormLayout.LabelRole, self.label_2)
|
||||||
|
self.comboBoxBaud = QtWidgets.QComboBox(self.groupBox)
|
||||||
|
self.comboBoxBaud.setObjectName("comboBoxBaud")
|
||||||
|
self.comboBoxBaud.addItem("")
|
||||||
|
self.comboBoxBaud.addItem("")
|
||||||
|
self.comboBoxBaud.addItem("")
|
||||||
|
self.comboBoxBaud.addItem("")
|
||||||
|
self.comboBoxBaud.addItem("")
|
||||||
|
self.comboBoxBaud.addItem("")
|
||||||
|
self.comboBoxBaud.addItem("")
|
||||||
|
self.comboBoxBaud.addItem("")
|
||||||
|
self.formLayout.setWidget(1, QtWidgets.QFormLayout.FieldRole, self.comboBoxBaud)
|
||||||
|
self.label_3 = QtWidgets.QLabel(self.groupBox)
|
||||||
|
self.label_3.setObjectName("label_3")
|
||||||
|
self.formLayout.setWidget(2, QtWidgets.QFormLayout.LabelRole, self.label_3)
|
||||||
|
self.comboBoxParity = QtWidgets.QComboBox(self.groupBox)
|
||||||
|
self.comboBoxParity.setObjectName("comboBoxParity")
|
||||||
|
self.comboBoxParity.addItem("")
|
||||||
|
self.comboBoxParity.addItem("")
|
||||||
|
self.comboBoxParity.addItem("")
|
||||||
|
self.comboBoxParity.addItem("")
|
||||||
|
self.comboBoxParity.addItem("")
|
||||||
|
self.comboBoxParity.addItem("")
|
||||||
|
self.formLayout.setWidget(2, QtWidgets.QFormLayout.FieldRole, self.comboBoxParity)
|
||||||
|
self.label_4 = QtWidgets.QLabel(self.groupBox)
|
||||||
|
self.label_4.setObjectName("label_4")
|
||||||
|
self.formLayout.setWidget(3, QtWidgets.QFormLayout.LabelRole, self.label_4)
|
||||||
|
self.comboBoxData = QtWidgets.QComboBox(self.groupBox)
|
||||||
|
self.comboBoxData.setObjectName("comboBoxData")
|
||||||
|
self.comboBoxData.addItem("")
|
||||||
|
self.comboBoxData.addItem("")
|
||||||
|
self.comboBoxData.addItem("")
|
||||||
|
self.comboBoxData.addItem("")
|
||||||
|
self.formLayout.setWidget(3, QtWidgets.QFormLayout.FieldRole, self.comboBoxData)
|
||||||
|
self.label_5 = QtWidgets.QLabel(self.groupBox)
|
||||||
|
self.label_5.setObjectName("label_5")
|
||||||
|
self.formLayout.setWidget(4, QtWidgets.QFormLayout.LabelRole, self.label_5)
|
||||||
|
self.comboBoxStop = QtWidgets.QComboBox(self.groupBox)
|
||||||
|
self.comboBoxStop.setObjectName("comboBoxStop")
|
||||||
|
self.comboBoxStop.addItem("")
|
||||||
|
self.comboBoxStop.addItem("")
|
||||||
|
self.comboBoxStop.addItem("")
|
||||||
|
self.comboBoxStop.addItem("")
|
||||||
|
self.formLayout.setWidget(4, QtWidgets.QFormLayout.FieldRole, self.comboBoxStop)
|
||||||
|
self.buttonConnect = QtWidgets.QPushButton(self.groupBox)
|
||||||
|
self.buttonConnect.setObjectName("buttonConnect")
|
||||||
|
self.formLayout.setWidget(5, QtWidgets.QFormLayout.FieldRole, self.buttonConnect)
|
||||||
|
self.labelStatus = QtWidgets.QLabel(self.groupBox)
|
||||||
|
self.labelStatus.setProperty("isOn", False)
|
||||||
|
self.labelStatus.setObjectName("labelStatus")
|
||||||
|
self.formLayout.setWidget(5, QtWidgets.QFormLayout.LabelRole, self.labelStatus)
|
||||||
|
spacerItem = QtWidgets.QSpacerItem(20, 40, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding)
|
||||||
|
self.formLayout.setItem(6, QtWidgets.QFormLayout.FieldRole, spacerItem)
|
||||||
|
self.gridLayout.addWidget(self.groupBox, 0, 0, 1, 1)
|
||||||
|
self.textBrowser = QtWidgets.QTextBrowser(FormSerialPort)
|
||||||
|
self.textBrowser.setObjectName("textBrowser")
|
||||||
|
self.gridLayout.addWidget(self.textBrowser, 0, 1, 2, 1)
|
||||||
|
self.widget = QtWidgets.QWidget(FormSerialPort)
|
||||||
|
self.widget.setObjectName("widget")
|
||||||
|
self.verticalLayout = QtWidgets.QVBoxLayout(self.widget)
|
||||||
|
self.verticalLayout.setObjectName("verticalLayout")
|
||||||
|
self.pushButton_2 = QtWidgets.QPushButton(self.widget)
|
||||||
|
self.pushButton_2.setObjectName("pushButton_2")
|
||||||
|
self.verticalLayout.addWidget(self.pushButton_2)
|
||||||
|
self.checkBoxHexView = QtWidgets.QCheckBox(self.widget)
|
||||||
|
self.checkBoxHexView.setObjectName("checkBoxHexView")
|
||||||
|
self.verticalLayout.addWidget(self.checkBoxHexView)
|
||||||
|
self.gridLayout.addWidget(self.widget, 1, 0, 1, 1)
|
||||||
|
self.widget_2 = QtWidgets.QWidget(FormSerialPort)
|
||||||
|
self.widget_2.setObjectName("widget_2")
|
||||||
|
self.verticalLayout_2 = QtWidgets.QVBoxLayout(self.widget_2)
|
||||||
|
self.verticalLayout_2.setObjectName("verticalLayout_2")
|
||||||
|
self.buttonSend = QtWidgets.QPushButton(self.widget_2)
|
||||||
|
self.buttonSend.setObjectName("buttonSend")
|
||||||
|
self.verticalLayout_2.addWidget(self.buttonSend)
|
||||||
|
self.checkBoxHexSend = QtWidgets.QCheckBox(self.widget_2)
|
||||||
|
self.checkBoxHexSend.setObjectName("checkBoxHexSend")
|
||||||
|
self.verticalLayout_2.addWidget(self.checkBoxHexSend)
|
||||||
|
self.gridLayout.addWidget(self.widget_2, 2, 0, 1, 1)
|
||||||
|
self.plainTextEdit = QtWidgets.QPlainTextEdit(FormSerialPort)
|
||||||
|
self.plainTextEdit.setObjectName("plainTextEdit")
|
||||||
|
self.gridLayout.addWidget(self.plainTextEdit, 2, 1, 1, 1)
|
||||||
|
self.gridLayout.setColumnStretch(1, 2)
|
||||||
|
self.gridLayout.setRowStretch(0, 3)
|
||||||
|
|
||||||
|
self.retranslateUi(FormSerialPort)
|
||||||
|
self.comboBoxBaud.setCurrentIndex(3)
|
||||||
|
self.comboBoxData.setCurrentIndex(3)
|
||||||
|
self.pushButton_2.clicked.connect(self.textBrowser.clear)
|
||||||
|
QtCore.QMetaObject.connectSlotsByName(FormSerialPort)
|
||||||
|
|
||||||
|
def retranslateUi(self, FormSerialPort):
|
||||||
|
_translate = QtCore.QCoreApplication.translate
|
||||||
|
FormSerialPort.setWindowTitle(_translate("FormSerialPort", "串口调试小助手"))
|
||||||
|
self.label.setText(_translate("FormSerialPort", "端 口"))
|
||||||
|
self.label_2.setText(_translate("FormSerialPort", "波特率"))
|
||||||
|
self.comboBoxBaud.setItemText(0, _translate("FormSerialPort", "1200"))
|
||||||
|
self.comboBoxBaud.setItemText(1, _translate("FormSerialPort", "2400"))
|
||||||
|
self.comboBoxBaud.setItemText(2, _translate("FormSerialPort", "4800"))
|
||||||
|
self.comboBoxBaud.setItemText(3, _translate("FormSerialPort", "9600"))
|
||||||
|
self.comboBoxBaud.setItemText(4, _translate("FormSerialPort", "19200"))
|
||||||
|
self.comboBoxBaud.setItemText(5, _translate("FormSerialPort", "38400"))
|
||||||
|
self.comboBoxBaud.setItemText(6, _translate("FormSerialPort", "57600"))
|
||||||
|
self.comboBoxBaud.setItemText(7, _translate("FormSerialPort", "115200"))
|
||||||
|
self.label_3.setText(_translate("FormSerialPort", "校验位"))
|
||||||
|
self.comboBoxParity.setItemText(0, _translate("FormSerialPort", "No"))
|
||||||
|
self.comboBoxParity.setItemText(1, _translate("FormSerialPort", "Even"))
|
||||||
|
self.comboBoxParity.setItemText(2, _translate("FormSerialPort", "Odd"))
|
||||||
|
self.comboBoxParity.setItemText(3, _translate("FormSerialPort", "Space"))
|
||||||
|
self.comboBoxParity.setItemText(4, _translate("FormSerialPort", "Mark"))
|
||||||
|
self.comboBoxParity.setItemText(5, _translate("FormSerialPort", "Unknown"))
|
||||||
|
self.label_4.setText(_translate("FormSerialPort", "数据位"))
|
||||||
|
self.comboBoxData.setItemText(0, _translate("FormSerialPort", "5"))
|
||||||
|
self.comboBoxData.setItemText(1, _translate("FormSerialPort", "6"))
|
||||||
|
self.comboBoxData.setItemText(2, _translate("FormSerialPort", "7"))
|
||||||
|
self.comboBoxData.setItemText(3, _translate("FormSerialPort", "8"))
|
||||||
|
self.label_5.setText(_translate("FormSerialPort", "停止位"))
|
||||||
|
self.comboBoxStop.setItemText(0, _translate("FormSerialPort", "OneStop"))
|
||||||
|
self.comboBoxStop.setItemText(1, _translate("FormSerialPort", "OneAndHalfStop"))
|
||||||
|
self.comboBoxStop.setItemText(2, _translate("FormSerialPort", "TwoStop"))
|
||||||
|
self.comboBoxStop.setItemText(3, _translate("FormSerialPort", "UnknownStopBits"))
|
||||||
|
self.buttonConnect.setText(_translate("FormSerialPort", "打开串口"))
|
||||||
|
self.labelStatus.setText(_translate("FormSerialPort", " "))
|
||||||
|
self.pushButton_2.setText(_translate("FormSerialPort", "清空接收区"))
|
||||||
|
self.checkBoxHexView.setText(_translate("FormSerialPort", "十六进制显示"))
|
||||||
|
self.buttonSend.setText(_translate("FormSerialPort", "手动发送"))
|
||||||
|
self.checkBoxHexSend.setText(_translate("FormSerialPort", "十六进制发送"))
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
import sys
|
||||||
|
app = QtWidgets.QApplication(sys.argv)
|
||||||
|
FormSerialPort = QtWidgets.QWidget()
|
||||||
|
ui = Ui_FormSerialPort()
|
||||||
|
ui.setupUi(FormSerialPort)
|
||||||
|
FormSerialPort.show()
|
||||||
|
sys.exit(app.exec_())
|
||||||
|
|
305
其它/串口调试小助手/UiSerialPort.ui
Normal file
305
其它/串口调试小助手/UiSerialPort.ui
Normal file
|
@ -0,0 +1,305 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<ui version="4.0">
|
||||||
|
<class>FormSerialPort</class>
|
||||||
|
<widget class="QWidget" name="FormSerialPort">
|
||||||
|
<property name="geometry">
|
||||||
|
<rect>
|
||||||
|
<x>0</x>
|
||||||
|
<y>0</y>
|
||||||
|
<width>721</width>
|
||||||
|
<height>597</height>
|
||||||
|
</rect>
|
||||||
|
</property>
|
||||||
|
<property name="windowTitle">
|
||||||
|
<string>串口调试小助手</string>
|
||||||
|
</property>
|
||||||
|
<property name="styleSheet">
|
||||||
|
<string notr="true">#labelStatus {
|
||||||
|
border-radius: 13px;
|
||||||
|
background-color: gray;
|
||||||
|
}
|
||||||
|
#labelStatus[isOn="true"] {
|
||||||
|
background-color: green;
|
||||||
|
}</string>
|
||||||
|
</property>
|
||||||
|
<layout class="QGridLayout" name="gridLayout" rowstretch="3,0,0" columnstretch="0,2">
|
||||||
|
<item row="0" column="0">
|
||||||
|
<widget class="QGroupBox" name="groupBox">
|
||||||
|
<property name="title">
|
||||||
|
<string/>
|
||||||
|
</property>
|
||||||
|
<layout class="QFormLayout" name="formLayout">
|
||||||
|
<property name="labelAlignment">
|
||||||
|
<set>Qt::AlignCenter</set>
|
||||||
|
</property>
|
||||||
|
<item row="0" column="0">
|
||||||
|
<widget class="QLabel" name="label">
|
||||||
|
<property name="text">
|
||||||
|
<string>端 口</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="0" column="1">
|
||||||
|
<widget class="QComboBox" name="comboBoxPort"/>
|
||||||
|
</item>
|
||||||
|
<item row="1" column="0">
|
||||||
|
<widget class="QLabel" name="label_2">
|
||||||
|
<property name="text">
|
||||||
|
<string>波特率</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="1" column="1">
|
||||||
|
<widget class="QComboBox" name="comboBoxBaud">
|
||||||
|
<property name="currentIndex">
|
||||||
|
<number>3</number>
|
||||||
|
</property>
|
||||||
|
<item>
|
||||||
|
<property name="text">
|
||||||
|
<string>1200</string>
|
||||||
|
</property>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<property name="text">
|
||||||
|
<string>2400</string>
|
||||||
|
</property>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<property name="text">
|
||||||
|
<string>4800</string>
|
||||||
|
</property>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<property name="text">
|
||||||
|
<string>9600</string>
|
||||||
|
</property>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<property name="text">
|
||||||
|
<string>19200</string>
|
||||||
|
</property>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<property name="text">
|
||||||
|
<string>38400</string>
|
||||||
|
</property>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<property name="text">
|
||||||
|
<string>57600</string>
|
||||||
|
</property>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<property name="text">
|
||||||
|
<string>115200</string>
|
||||||
|
</property>
|
||||||
|
</item>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="2" column="0">
|
||||||
|
<widget class="QLabel" name="label_3">
|
||||||
|
<property name="text">
|
||||||
|
<string>校验位</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="2" column="1">
|
||||||
|
<widget class="QComboBox" name="comboBoxParity">
|
||||||
|
<item>
|
||||||
|
<property name="text">
|
||||||
|
<string>No</string>
|
||||||
|
</property>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<property name="text">
|
||||||
|
<string>Even</string>
|
||||||
|
</property>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<property name="text">
|
||||||
|
<string>Odd</string>
|
||||||
|
</property>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<property name="text">
|
||||||
|
<string>Space</string>
|
||||||
|
</property>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<property name="text">
|
||||||
|
<string>Mark</string>
|
||||||
|
</property>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<property name="text">
|
||||||
|
<string>Unknown</string>
|
||||||
|
</property>
|
||||||
|
</item>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="3" column="0">
|
||||||
|
<widget class="QLabel" name="label_4">
|
||||||
|
<property name="text">
|
||||||
|
<string>数据位</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="3" column="1">
|
||||||
|
<widget class="QComboBox" name="comboBoxData">
|
||||||
|
<property name="currentIndex">
|
||||||
|
<number>3</number>
|
||||||
|
</property>
|
||||||
|
<item>
|
||||||
|
<property name="text">
|
||||||
|
<string>5</string>
|
||||||
|
</property>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<property name="text">
|
||||||
|
<string>6</string>
|
||||||
|
</property>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<property name="text">
|
||||||
|
<string>7</string>
|
||||||
|
</property>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<property name="text">
|
||||||
|
<string>8</string>
|
||||||
|
</property>
|
||||||
|
</item>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="4" column="0">
|
||||||
|
<widget class="QLabel" name="label_5">
|
||||||
|
<property name="text">
|
||||||
|
<string>停止位</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="4" column="1">
|
||||||
|
<widget class="QComboBox" name="comboBoxStop">
|
||||||
|
<item>
|
||||||
|
<property name="text">
|
||||||
|
<string>OneStop</string>
|
||||||
|
</property>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<property name="text">
|
||||||
|
<string>OneAndHalfStop</string>
|
||||||
|
</property>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<property name="text">
|
||||||
|
<string>TwoStop</string>
|
||||||
|
</property>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<property name="text">
|
||||||
|
<string>UnknownStopBits</string>
|
||||||
|
</property>
|
||||||
|
</item>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="5" column="1">
|
||||||
|
<widget class="QPushButton" name="buttonConnect">
|
||||||
|
<property name="text">
|
||||||
|
<string>打开串口</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="5" column="0">
|
||||||
|
<widget class="QLabel" name="labelStatus">
|
||||||
|
<property name="text">
|
||||||
|
<string> </string>
|
||||||
|
</property>
|
||||||
|
<property name="isOn" stdset="0">
|
||||||
|
<bool>false</bool>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="6" column="1">
|
||||||
|
<spacer name="verticalSpacer">
|
||||||
|
<property name="orientation">
|
||||||
|
<enum>Qt::Vertical</enum>
|
||||||
|
</property>
|
||||||
|
<property name="sizeHint" stdset="0">
|
||||||
|
<size>
|
||||||
|
<width>20</width>
|
||||||
|
<height>40</height>
|
||||||
|
</size>
|
||||||
|
</property>
|
||||||
|
</spacer>
|
||||||
|
</item>
|
||||||
|
</layout>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="0" column="1" rowspan="2">
|
||||||
|
<widget class="QTextBrowser" name="textBrowser"/>
|
||||||
|
</item>
|
||||||
|
<item row="1" column="0">
|
||||||
|
<widget class="QWidget" name="widget" native="true">
|
||||||
|
<layout class="QVBoxLayout" name="verticalLayout">
|
||||||
|
<item>
|
||||||
|
<widget class="QPushButton" name="pushButton_2">
|
||||||
|
<property name="text">
|
||||||
|
<string>清空接收区</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<widget class="QCheckBox" name="checkBoxHexView">
|
||||||
|
<property name="text">
|
||||||
|
<string>十六进制显示</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
</layout>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="2" column="0">
|
||||||
|
<widget class="QWidget" name="widget_2" native="true">
|
||||||
|
<layout class="QVBoxLayout" name="verticalLayout_2">
|
||||||
|
<item>
|
||||||
|
<widget class="QPushButton" name="buttonSend">
|
||||||
|
<property name="text">
|
||||||
|
<string>手动发送</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<widget class="QCheckBox" name="checkBoxHexSend">
|
||||||
|
<property name="text">
|
||||||
|
<string>十六进制发送</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
</layout>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="2" column="1">
|
||||||
|
<widget class="QPlainTextEdit" name="plainTextEdit"/>
|
||||||
|
</item>
|
||||||
|
</layout>
|
||||||
|
</widget>
|
||||||
|
<resources/>
|
||||||
|
<connections>
|
||||||
|
<connection>
|
||||||
|
<sender>pushButton_2</sender>
|
||||||
|
<signal>clicked()</signal>
|
||||||
|
<receiver>textBrowser</receiver>
|
||||||
|
<slot>clear()</slot>
|
||||||
|
<hints>
|
||||||
|
<hint type="sourcelabel">
|
||||||
|
<x>136</x>
|
||||||
|
<y>328</y>
|
||||||
|
</hint>
|
||||||
|
<hint type="destinationlabel">
|
||||||
|
<x>477</x>
|
||||||
|
<y>236</y>
|
||||||
|
</hint>
|
||||||
|
</hints>
|
||||||
|
</connection>
|
||||||
|
</connections>
|
||||||
|
</ui>
|
143
其它/串口调试小助手/串口调试小助手.py
Normal file
143
其它/串口调试小助手/串口调试小助手.py
Normal file
|
@ -0,0 +1,143 @@
|
||||||
|
#!/usr/bin/env python
|
||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
|
||||||
|
"""
|
||||||
|
Created on 2018年11月6日
|
||||||
|
@author: Irony
|
||||||
|
@site: https://pyqt5.com, https://github.com/892768447
|
||||||
|
@email: 892768447@qq.com
|
||||||
|
@file: 串口调试小助手
|
||||||
|
@description:
|
||||||
|
"""
|
||||||
|
from PyQt5.QtCore import pyqtSlot, QIODevice, QByteArray
|
||||||
|
from PyQt5.QtSerialPort import QSerialPortInfo, QSerialPort
|
||||||
|
from PyQt5.QtWidgets import QWidget
|
||||||
|
|
||||||
|
from UiSerialPort import Ui_FormSerialPort # @UnresolvedImport
|
||||||
|
|
||||||
|
|
||||||
|
__Author__ = """By: Irony
|
||||||
|
QQ: 892768447
|
||||||
|
Email: 892768447@qq.com"""
|
||||||
|
__Copyright__ = 'Copyright (c) 2018 Irony'
|
||||||
|
__Version__ = 1.0
|
||||||
|
|
||||||
|
|
||||||
|
class Window(QWidget, Ui_FormSerialPort):
|
||||||
|
|
||||||
|
def __init__(self, *args, **kwargs):
|
||||||
|
super(Window, self).__init__(*args, **kwargs)
|
||||||
|
self.setupUi(self)
|
||||||
|
self._serial = QSerialPort(self) # 用于连接串口的对象
|
||||||
|
self._serial.readyRead.connect(self.onReadyRead) # 绑定数据读取信号
|
||||||
|
# 首先获取可用的串口列表
|
||||||
|
self.getAvailablePorts()
|
||||||
|
|
||||||
|
@pyqtSlot()
|
||||||
|
def on_buttonConnect_clicked(self):
|
||||||
|
# 打开或关闭串口按钮
|
||||||
|
if self._serial.isOpen():
|
||||||
|
# 如果串口是打开状态则关闭
|
||||||
|
self._serial.close()
|
||||||
|
self.textBrowser.append('串口已关闭')
|
||||||
|
self.buttonConnect.setText('打开串口')
|
||||||
|
self.labelStatus.setProperty('isOn', False)
|
||||||
|
self.labelStatus.style().polish(self.labelStatus) # 刷新样式
|
||||||
|
return
|
||||||
|
|
||||||
|
# 根据配置连接串口
|
||||||
|
port = self._ports[self.comboBoxPort.currentText()]
|
||||||
|
# self._serial.setPort(port)
|
||||||
|
# 根据名字设置串口(也可以用上面的函数)
|
||||||
|
self._serial.setPortName(port.systemLocation())
|
||||||
|
# 设置波特率
|
||||||
|
self._serial.setBaudRate( # 动态获取,类似QSerialPort::Baud9600这样的吧
|
||||||
|
getattr(QSerialPort, 'Baud' + self.comboBoxBaud.currentText()))
|
||||||
|
# 设置校验位
|
||||||
|
self._serial.setParity( # QSerialPort::NoParity
|
||||||
|
getattr(QSerialPort, self.comboBoxParity.currentText() + 'Parity'))
|
||||||
|
# 设置数据位
|
||||||
|
self._serial.setDataBits( # QSerialPort::Data8
|
||||||
|
getattr(QSerialPort, 'Data' + self.comboBoxData.currentText()))
|
||||||
|
# 设置停止位
|
||||||
|
self._serial.setStopBits( # QSerialPort::Data8
|
||||||
|
getattr(QSerialPort, self.comboBoxStop.currentText()))
|
||||||
|
|
||||||
|
# NoFlowControl 没有流程控制
|
||||||
|
# HardwareControl 硬件流程控制(RTS/CTS)
|
||||||
|
# SoftwareControl 软件流程控制(XON/XOFF)
|
||||||
|
# UnknownFlowControl 未知控制
|
||||||
|
self._serial.setFlowControl(QSerialPort.NoFlowControl)
|
||||||
|
# 读写方式打开串口
|
||||||
|
ok = self._serial.open(QIODevice.ReadWrite)
|
||||||
|
if ok:
|
||||||
|
self.textBrowser.append('打开串口成功')
|
||||||
|
self.buttonConnect.setText('关闭串口')
|
||||||
|
self.labelStatus.setProperty('isOn', True)
|
||||||
|
self.labelStatus.style().polish(self.labelStatus) # 刷新样式
|
||||||
|
else:
|
||||||
|
self.textBrowser.append('打开串口失败')
|
||||||
|
self.buttonConnect.setText('打开串口')
|
||||||
|
self.labelStatus.setProperty('isOn', False)
|
||||||
|
self.labelStatus.style().polish(self.labelStatus) # 刷新样式
|
||||||
|
|
||||||
|
@pyqtSlot()
|
||||||
|
def on_buttonSend_clicked(self):
|
||||||
|
# 发送消息按钮
|
||||||
|
if not self._serial.isOpen():
|
||||||
|
print('串口未连接')
|
||||||
|
return
|
||||||
|
text = self.plainTextEdit.toPlainText()
|
||||||
|
if not text:
|
||||||
|
return
|
||||||
|
text = QByteArray(text.encode('gb2312')) # emmm windows 测试的工具貌似是这个编码
|
||||||
|
if self.checkBoxHexSend.isChecked():
|
||||||
|
# 如果勾选了hex发送
|
||||||
|
text = text.toHex()
|
||||||
|
# 发送数据
|
||||||
|
print('发送数据:', text)
|
||||||
|
self._serial.write(text)
|
||||||
|
|
||||||
|
def onReadyRead(self):
|
||||||
|
# 数据接收响应
|
||||||
|
if self._serial.bytesAvailable():
|
||||||
|
# 当数据可读取时
|
||||||
|
# 这里只是简答测试少量数据,如果数据量太多了此处readAll其实并没有读完
|
||||||
|
# 需要自行设置粘包协议
|
||||||
|
data = self._serial.readAll()
|
||||||
|
if self.checkBoxHexView.isChecked():
|
||||||
|
# 如果勾选了hex显示
|
||||||
|
data = data.toHex()
|
||||||
|
data = data.data()
|
||||||
|
# 解码显示(中文啥的)
|
||||||
|
try:
|
||||||
|
self.textBrowser.append('我收到了: ' + data.decode('gb2312'))
|
||||||
|
except:
|
||||||
|
# 解码失败
|
||||||
|
self.textBrowser.append('我收到了: ' + repr(data))
|
||||||
|
|
||||||
|
def getAvailablePorts(self):
|
||||||
|
# 获取可用的串口
|
||||||
|
self._ports = {} # 用于保存串口的信息
|
||||||
|
infos = QSerialPortInfo.availablePorts()
|
||||||
|
infos.reverse() # 逆序
|
||||||
|
for info in infos:
|
||||||
|
# 通过串口名字-->关联串口变量
|
||||||
|
self._ports[info.portName()] = info
|
||||||
|
self.comboBoxPort.addItem(info.portName())
|
||||||
|
|
||||||
|
def closeEvent(self, event):
|
||||||
|
if self._serial.isOpen():
|
||||||
|
self._serial.close()
|
||||||
|
super(Window, self).closeEvent(event)
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
import sys
|
||||||
|
import cgitb
|
||||||
|
sys.excepthook = cgitb.enable(1, None, 5, '')
|
||||||
|
from PyQt5.QtWidgets import QApplication
|
||||||
|
app = QApplication(sys.argv)
|
||||||
|
w = Window()
|
||||||
|
w.show()
|
||||||
|
sys.exit(app.exec_())
|
Loading…
Reference in a new issue