串口小工具(来源网络,源码修改)

从CSDN 中的一位博主的分享做了一些修改

QtSerial 的配和更稳定些

信号和槽 … … 更不容易崩

# This Python file uses the following encoding: utf-8
import sys
import timefrom PySide6.QtGui import QIcon, QTextCursor
from PySide6.QtWidgets import QApplication, QWidget, QMainWindow, QMessageBox
from PySide6.QtCore import QTimer, QThread
# Important:
# You need to run the following command to generate the ui_form.py file
#     pyside6-uic form.ui -o ui_form.py, or
#     pyside2-uic form.ui -o ui_form.py
from ui_form import Ui_MainWindow
import PySide6.QtSerialPort as serial
import PySide6.QtCore as QtCoreclass MainWindow(QMainWindow, Ui_MainWindow):_recvThread = NoneportSelect = NonebitSize = serial.QSerialPort.DataBits.Data8def __init__(self, parent=None):super().__init__(parent)self.portDict = Noneself.ui = Ui_MainWindow()self.ui.setupUi(self)self.setWindowTitle('串口小工具')self.mSerial = serial.QSerialPort()self.ScanComPort()  # 扫描一次串口端口self.OnPortChanged()self.ui.comboBox_Baudrate.setCurrentText("115200")  # 设置默认波特率self.ui.comboBox_ByteSize.setCurrentText("8")  # 设置默认数据位self.ui.BtnScanPort.clicked.connect(self.ScanComPort)self.ui.BtnOpenPort.clicked.connect(self.OpenComPort)self.ui.BtnClosePort.clicked.connect(self.CloseComPort)self.ui.BtnSendData.clicked.connect(self.SendData)self.ui.BtnClearRecv.clicked.connect(self.ClearRecvText)self.ui.BtnClearSend.clicked.connect(self.ClearSendText)self.ui.comboBox_ComPort.currentIndexChanged.connect(self.OnPortChanged)def ClearRecvText(self):self.ui.textBrowserRecvArea.clear()def ClearSendText(self):self.ui.lineEdit_SendData.clear()def OnPortChanged(self):if len(self.portDict) > 0:self.ui.label_CurrentPortName.setText(self.portDict[self.ui.comboBox_ComPort.currentText()])def ScanComPort(self):self.portDict = {}self.portSelect = {}self.ui.comboBox_ComPort.clear()portList = serial.QSerialPortInfo.availablePorts()for port in portList:self.portDict["%s" % port.portName()] = "%s" % port.description()self.portSelect["%s" % port.portName()] = portself.ui.comboBox_ComPort.addItem(port.portName())if len(self.portDict) == 0:QMessageBox.critical(self, "警告", "未找到串口", QMessageBox.StandardButton.Cancel,QMessageBox.StandardButton.Cancel)passdef OpenComPort(self):port = self.ui.comboBox_ComPort.currentText()self.mSerial.setPort(self.portSelect[port])baudrate = int(self.ui.comboBox_Baudrate.currentText())self.mSerial.setBaudRate(baudrate)# 数据位设置bytesize = self.ui.comboBox_ByteSize.currentText()if "5" == bytesize:bitSize = serial.QSerialPort.DataBits.Data5elif "6" == bytesize:bitSize = serial.QSerialPort.DataBits.Data6elif "7" == bytesize:bitSize = serial.QSerialPort.DataBits.Data7elif "8" == bytesize:bitSize = serial.QSerialPort.DataBits.Data8self.mSerial.setDataBits(bitSize)stopbitsItems = [serial.QSerialPort.StopBits.OneStop, serial.QSerialPort.StopBits.OneAndHalfStop,serial.QSerialPort.StopBits.TwoStop]stopbits = stopbitsItems[self.ui.comboBox_Stopbits.currentIndex()]self.mSerial.setStopBits(stopbits)parityItmes = [serial.QSerialPort.Parity.NoParity,serial.QSerialPort.Parity.OddParity,serial.QSerialPort.Parity.EvenParity,serial.QSerialPort.Parity.MarkParity,serial.QSerialPort.Parity.SpaceParity,serial.QSerialPort.Parity.NoParity]self.mSerial.setParity(parityItmes[self.ui.comboBox_Parity.currentIndex()])flowctrl = self.ui.comboBox_FlowCtrl.currentText()if 'None' == flowctrl:self.mSerial.setFlowControl(serial.QSerialPort.FlowControl.NoFlowControl)elif 'XON/XOFF' == flowctrl:self.mSerial.setFlowControl(serial.QSerialPort.FlowControl.SoftwareControl)elif 'RTS/CTS' == flowctrl:self.mSerial.setFlowControl(serial.QSerialPort.FlowControl.HardwareControl)self.mSerial.timeout = 100if self.mSerial.isOpen():QMessageBox.warning(self, "警告", "串口已打开", QMessageBox.StandardButton.Cancel,QMessageBox.StandardButton.Cancel)else:try:self.ui.BtnOpenPort.setEnabled(False)self.mSerial.open(QtCore.QIODeviceBase.OpenModeFlag.ReadWrite)self.mSerial.flush()self._recvThread = QThread(self)self._recvThread.run = self.RecvDataself._recvThread.start()except SerialException as error:QMessageBox.critical(self, "警告", "串口打开失败:%s" % error.strerror,QMessageBox.StandardButton.Cancel,QMessageBox.StandardButton.Cancel)self.ui.BtnOpenPort.setEnabled(True)self.mSerial.readyRead.connect(self.RecvData)def CloseComPort(self):if self._recvThread is not None:if self._recvThread.isRunning():self._recvThread.exit(1)if self.mSerial.isOpen():self.ui.BtnOpenPort.setEnabled(True)self.mSerial.flush()self.mSerial.close()passdef SendData(self):if self.mSerial.isOpen():if self.mSerial.isWritable():sendtext = self.ui.lineEdit_SendData.text() + "\r"self.mSerial.write(sendtext.encode("utf-8"))else:QMessageBox.warning(self, "警告", "串口未打开,请先打开串口", QMessageBox.StandardButton.Cancel,QMessageBox.StandardButton.Cancel)def refreshConsole(self):self.ui.textBrowserRecvArea.moveCursor(QTextCursor.MoveOperation.End)def RecvData(self):rdata = self.mSerial.readAll()self.ui.textBrowserRecvArea.append(rdata.data().decode("utf-8").strip("\n"))self.refreshConsole()if __name__ == '__main__':app = QApplication(sys.argv)mw = MainWindow()mw.show()sys.exit(app.exec())

ui

<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0"><class>MainWindow</class><widget class="QMainWindow" name="MainWindow"><property name="geometry"><rect><x>0</x><y>0</y><width>1439</width><height>713</height></rect></property><property name="windowTitle"><string>MainWindow</string></property><widget class="QWidget" name="centralwidget"><widget class="QGroupBox" name="groupBox_ComSettings"><property name="geometry"><rect><x>10</x><y>20</y><width>221</width><height>471</height></rect></property><property name="title"><string>串口设置</string></property><widget class="QWidget" name="horizontalLayoutWidget"><property name="geometry"><rect><x>10</x><y>400</y><width>201</width><height>51</height></rect></property><layout class="QHBoxLayout" name="horizontalLayout"><item><widget class="QPushButton" name="BtnOpenPort"><property name="text"><string>打开串口</string></property></widget></item><item><widget class="QPushButton" name="BtnClosePort"><property name="text"><string>关闭串口</string></property></widget></item></layout></widget><widget class="QWidget" name="horizontalLayoutWidget_2"><property name="geometry"><rect><x>10</x><y>350</y><width>201</width><height>51</height></rect></property><layout class="QHBoxLayout" name="horizontalLayout_8"><item><widget class="QPushButton" name="BtnScanPort"><property name="text"><string>扫描端口</string></property></widget></item></layout></widget><widget class="QLabel" name="label_CurrentPortName"><property name="geometry"><rect><x>10</x><y>20</y><width>201</width><height>31</height></rect></property><property name="text"><string/></property></widget><widget class="QWidget" name="layoutWidget"><property name="geometry"><rect><x>10</x><y>60</y><width>201</width><height>281</height></rect></property><layout class="QVBoxLayout" name="verticalLayout"><item><layout class="QHBoxLayout" name="horizontalLayout_2"><item><widget class="QLabel" name="label_ComPort"><property name="maximumSize"><size><width>60</width><height>16777215</height></size></property><property name="text"><string>串  口</string></property></widget></item><item><widget class="QComboBox" name="comboBox_ComPort"><property name="editable"><bool>false</bool></property></widget></item></layout></item><item><layout class="QHBoxLayout" name="horizontalLayout_3"><item><widget class="QLabel" name="label_Baudrate"><property name="maximumSize"><size><width>60</width><height>16777215</height></size></property><property name="text"><string>波特率</string></property></widget></item><item><widget class="QComboBox" name="comboBox_Baudrate"><property name="editable"><bool>true</bool></property><property name="currentText"><string>115200</string></property><property name="currentIndex"><number>8</number></property><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>14400</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>56000</string></property></item><item><property name="text"><string>57600</string></property></item><item><property name="text"><string>115200</string></property></item><item><property name="text"><string>128000</string></property></item><item><property name="text"><string>256000</string></property></item><item><property name="text"><string>230400</string></property></item><item><property name="text"><string>1000000</string></property></item><item><property name="text"><string>2000000</string></property></item><item><property name="text"><string>3000000</string></property></item></widget></item></layout></item><item><layout class="QHBoxLayout" name="horizontalLayout_4"><item><widget class="QLabel" name="label_ByteSize"><property name="maximumSize"><size><width>60</width><height>16777215</height></size></property><property name="text"><string>数据位</string></property></widget></item><item><widget class="QComboBox" name="comboBox_ByteSize"><property name="editable"><bool>false</bool></property><property name="currentText"><string>8</string></property><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></layout></item><item><layout class="QHBoxLayout" name="horizontalLayout_6"><item><widget class="QLabel" name="label_Stopbits"><property name="maximumSize"><size><width>60</width><height>16777215</height></size></property><property name="text"><string>停止位</string></property></widget></item><item><widget class="QComboBox" name="comboBox_Stopbits"><item><property name="text"><string>1</string></property></item><item><property name="text"><string>1.5</string></property></item><item><property name="text"><string>2</string></property></item></widget></item></layout></item><item><layout class="QHBoxLayout" name="horizontalLayout_5"><item><widget class="QLabel" name="label_Parity"><property name="maximumSize"><size><width>60</width><height>16777215</height></size></property><property name="text"><string>校验位</string></property></widget></item><item><widget class="QComboBox" name="comboBox_Parity"><item><property name="text"><string>None</string></property></item><item><property name="text"><string>Odd</string></property></item><item><property name="text"><string>Even</string></property></item><item><property name="text"><string>Mark</string></property></item><item><property name="text"><string>Space</string></property></item></widget></item></layout></item><item><layout class="QHBoxLayout" name="horizontalLayout_7"><item><widget class="QLabel" name="label_CTS"><property name="maximumSize"><size><width>60</width><height>16777215</height></size></property><property name="text"><string>流  控</string></property></widget></item><item><widget class="QComboBox" name="comboBox_FlowCtrl"><item><property name="text"><string>None</string></property></item><item><property name="text"><string>RTS/CTS</string></property></item><item><property name="text"><string>XON/XOFF</string></property></item></widget></item></layout></item></layout></widget></widget><widget class="QGroupBox" name="groupBox"><property name="geometry"><rect><x>250</x><y>20</y><width>1181</width><height>471</height></rect></property><property name="title"><string>接收区</string></property><widget class="QTextBrowser" name="textBrowserRecvArea"><property name="geometry"><rect><x>10</x><y>20</y><width>1161</width><height>441</height></rect></property></widget></widget><widget class="QGroupBox" name="groupBox_2"><property name="geometry"><rect><x>250</x><y>500</y><width>1181</width><height>151</height></rect></property><property name="title"><string>发送区</string></property><widget class="QLineEdit" name="lineEdit_SendData"><property name="geometry"><rect><x>10</x><y>20</y><width>561</width><height>31</height></rect></property></widget><widget class="QPushButton" name="BtnSendData"><property name="geometry"><rect><x>580</x><y>20</y><width>181</width><height>31</height></rect></property><property name="text"><string>发送数据</string></property></widget><widget class="QPushButton" name="BtnClearRecv"><property name="geometry"><rect><x>760</x><y>20</y><width>171</width><height>31</height></rect></property><property name="text"><string>清空接收区</string></property></widget><widget class="QPushButton" name="BtnClearSend"><property name="geometry"><rect><x>930</x><y>20</y><width>171</width><height>31</height></rect></property><property name="text"><string>清空发送区</string></property></widget><widget class="QPushButton" name="BtnSendData_2"><property name="geometry"><rect><x>930</x><y>60</y><width>171</width><height>31</height></rect></property><property name="text"><string>循环执行脚本</string></property></widget><widget class="QPushButton" name="BtnSendData_3"><property name="geometry"><rect><x>760</x><y>60</y><width>171</width><height>31</height></rect></property><property name="text"><string>导入命令脚本</string></property></widget><widget class="QPushButton" name="BtnSendData_4"><property name="geometry"><rect><x>580</x><y>60</y><width>181</width><height>31</height></rect></property><property name="text"><string>执行命令脚本</string></property></widget><widget class="QComboBox" name="comboBox"><property name="geometry"><rect><x>10</x><y>100</y><width>561</width><height>31</height></rect></property></widget><widget class="QPushButton" name="BtnSendData_5"><property name="geometry"><rect><x>580</x><y>100</y><width>181</width><height>31</height></rect></property><property name="text"><string>变更输出解析类型</string></property></widget><widget class="QPushButton" name="BtnSendData_6"><property name="geometry"><rect><x>760</x><y>100</y><width>171</width><height>31</height></rect></property><property name="text"><string>导入输出解析类型</string></property></widget><widget class="QPushButton" name="BtnSendData_7"><property name="geometry"><rect><x>930</x><y>100</y><width>171</width><height>31</height></rect></property><property name="text"><string>冻结/解冻</string></property></widget><widget class="QComboBox" name="comboBox_2"><property name="geometry"><rect><x>10</x><y>60</y><width>561</width><height>31</height></rect></property></widget></widget></widget><widget class="QMenuBar" name="menubar"><property name="geometry"><rect><x>0</x><y>0</y><width>1439</width><height>17</height></rect></property></widget><widget class="QStatusBar" name="statusbar"/></widget><resources/><connections/>
</ui>

在这里插入图片描述> 添加键盘监听事件

在这里插入图片描述

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/38030.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

第3章_UART 开发基础

文章目录 第3章 UART 开发基础3.1 同步传输与异步传输3.1.1 概念与示例3.1.2 差别 3.2 UART 协议与操作方法3.2.1 UART 协议3.2.2 STM32H5 UART 硬件结构3.2.3 RS485 协议 3.3 UART 编程3.3.1 硬件连接3.3.2 三种编程方式3.3.3 查询方式3.3.4 中断方式3.3.5 DMA 方式 3.4 效率最…

扫描全能王的AI驱动创新与智能高清滤镜技术解析

目录 引言1、扫描全能王2、智能高清滤镜黑科技2.1、图像视觉矫正2.2、去干扰技术 3、实际应用案例3.1、打印文稿褶皱检测3.2、试卷擦除手写3.3、老旧文件处理3.4、收银小票3.5、从不同角度扫描文档 4、用户体验结论与未来展望 引言 在数字化时代背景下&#xff0c;文档扫描功能…

【JavaEE】JVM

文章目录 一、JVM 简介二、JVM 运行流程三、JVM 运行时数据区1、堆&#xff08;线程共享&#xff09;2、Java虚拟机栈&#xff08;线程私有&#xff09;3、本地方法栈&#xff08;线程私有&#xff09;4、程序计数器&#xff08;线程私有&#xff09;5、方法区&#xff08;线程…

如何有效保护生物医药企业隔离网数据导出的安全性?

生物医药企业的核心数据保护至关重要&#xff0c;企业为了保护内部的核心数据&#xff0c;会将网络进行物理隔离&#xff0c;将企业内⽹与外⽹隔离。⽹络隔离后&#xff0c;仍存在重要数据从内网导出至外网的隔离网数据导出需求。以下是一些需要特别保护的核心数据类型&#xf…

【快速排序】| 详解快速排序 力扣912

&#x1f397;️ 主页&#xff1a;小夜时雨 &#x1f397;️专栏&#xff1a;快速排序 &#x1f397;️如何活着&#xff0c;是我找寻的方向 目录 1. 题目解析2. 代码 1. 题目解析 题目链接: https://leetcode.cn/problems/sort-an-array/ 我们上道题讲过快速排序的核心代码&a…

围观AI大佬吴恩达教授开发的Agent智能体

最近 Agent 智能体很火&#xff0c;人工智能领域国际上最权威的学者之一吴恩达教授&#xff0c;不但总结了Agent设计模式&#xff0c;还亲自下场开发了一款翻译Agent。 这个翻译Agent在设计模式和提示词工程等方面都有许多值得学习的地方。老渡拆解一下&#xff0c;跟朋友们分…

你需要明白的JVM相关问题

1、说说内存溢出跟内存泄漏的区别&#xff1f; 内存泄露&#xff1a;申请的内存空间没有被正确释放&#xff0c;导致内存被白白占用。内存溢出&#xff1a;申请的内存超过了可用内存&#xff0c;内存不够了。可能是泄漏导致的。 2、如何判断对象仍然存活&#xff1f;jvm是怎么…

mysql数据库的主从复制

MySQL主从复制的应用场景 当只有一台MySQL服务器要负责读写时&#xff0c;对于安全性&#xff0c;高可用&#xff0c;高并发等需求就不能满足&#xff0c;因此就要建立集群&#xff0c;集群的基础就是主从复制。 原理&#xff08;过程&#xff09; MySQL支持的复制类型 基于语…

有关主流编程语言的几个问题及对比

参考&#xff1a;编程语言的历史&#xff08;https://blog.csdn.net/david_lv/article/details/104765347&#xff09; 静态与动态语言的优缺点分析 什么是强类型&#xff0c;什么是弱类型&#xff1f;哪种更好些&#xff1f;为什么? 强类型和弱类型的区别 几种常见的开发语言…

【Kubernetes学习】

K8S基础概念一 一、k8s是什么&#xff1f;二、k8s功能三、k8s组件四、k8s概念总结 一、k8s是什么&#xff1f; kubernetes&#xff0c;简称k8s&#xff0c;是一个全新的基于容器技术的分布式架构领先方案&#xff0c;是谷歌严格保密十几年的秘密武器----Borg系统的一个开源版本…

kicad第三方插件安装问题

在使用KICAD时想安装扩展内容&#xff0c;但是遇到下载失败&#xff0c;因为SSL connect error。 因为是公司网络&#xff0c;我也不是很懂&#xff0c;只能另寻他法。找到如下方法可以曲线救国。 第三方插件包目录 打开存放第三方插件存放目录&#xff0c;用于存放下载插件包…

电子电路学习笔记(3)三极管

部分内容参考链接&#xff1a; 电子电路学习笔记&#xff08;5&#xff09;——三极管_三极管 箭头-CSDN博客 模拟电子技术基础笔记&#xff08;4&#xff09;——晶体三极管_集电结的单向导电性-CSDN博客 硬件基本功-36-三极管Ib电流如何控制Ic电流_哔哩哔哩_bilibili 部分…

【面试系列】数据工程师高频面试题及详细解答

欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;欢迎订阅相关专栏&#xff1a; ⭐️ 全网最全IT互联网公司面试宝典&#xff1a;收集整理全网各大IT互联网公司技术、项目、HR面试真题. ⭐️ AIGC时代的创新与未来&#xff1a;详细讲解AIGC的概念、核心技术、…

LIDAR360MLS V7.2.0 雷达点云数据处理软件功能介绍

LiDAR360MLS 是三维要素智能提取及分析软件&#xff0c;可灵活衔接市面上主流的多型号车载、背包或手持等移动测量设备采集的激光雷达点云与影像数据。软件基于高效的海量点云数据索引结构和人工智能算法&#xff0c;进行点云数据编辑、提取、分析等处理及道路要素目标的三维矢…

使用新H5标签dialog,实现点击按钮显示分享链接弹出层交互功能

使用新H5标签&#xff0c;实现点击按钮显示分享链接弹出层交互功能 在现代网页开发中&#xff0c;使用新技术和标签来提升用户体验是非常重要的。今天&#xff0c;我们就来聊聊如何利用HTML5的<dialog>标签来实现一个简洁实用的分享链接功能。 在过去&#xff0c;我们通常…

SpringBoot:集成机器学习模型进行预测和分析

引言 机器学习在现代应用程序中扮演着越来越重要的角色。通过集成机器学习模型&#xff0c;开发者可以实现智能预测和数据分析&#xff0c;从而提高应用程序的智能化水平。SpringBoot作为一个强大的框架&#xff0c;能够方便地集成机器学习模型&#xff0c;并提供灵活的部署和…

RT-Thread ENV-Windows v2.0.0安装教程

前言 前几天RT-Thread官方更新了env工具&#xff0c;开源仓库的Kconfig的写法都不大一样了&#xff1b;如果继续用原来的env工具&#xff0c;拉新代码之后很多示例都编译不了 在最新的env工具中menuconfig全面采用kconfiglib&#xff0c;升级env脚本和python版本&#xff0c;改…

Pascal 函数入门示例,及其汇编语言分析

1&#xff0c; Pascal 函数的定义格式 pascal 函数的定义语法格式: FUNCTION 函数名(形式参数表):函数类型; VAR 函数的变量说明; BEGIN 函数体; END; 2&#xff0c;Pascal 函数定义调用示例 order_self.pas 代码&#xff1a; PROGRAM example01;va…

PyTorch之nn.Module、nn.Sequential、nn.ModuleList使用详解

文章目录 1. nn.Module1.1 基本使用1.2 常用函数1.2.1 核心函数1.2.2 查看函数1.2.3 设置函数1.2.4 注册函数1.2.5 转换函数1.2.6 加载函数 2. nn.Sequential()2.1 基本定义2.2 Sequential类不同的实现2.3 nn.Sequential()的本质作用 3. nn.ModuleList参考资料 本篇文章主要介绍…

操作系统精选题(二)(综合模拟题一)

&#x1f308; 个人主页&#xff1a;十二月的猫-CSDN博客 &#x1f525; 系列专栏&#xff1a; &#x1f3c0;操作系统 &#x1f4aa;&#x1f3fb; 十二月的寒冬阻挡不了春天的脚步&#xff0c;十二点的黑夜遮蔽不住黎明的曙光 目录 前言 简答题 一、进程由计算和IO操作组…