Python打发无聊时光:14.用PyQt创建一个简易的串口调试助手

news2024/11/26 0:34:50

第一步:装pyqt5和pyserial库

pip install pyqt5 pyserial

第二步:完整代码

import sys
from PyQt5.QtWidgets import QApplication, QMainWindow, QPushButton, QVBoxLayout, QWidget, QLabel, QComboBox, \
    QGridLayout, QLineEdit, QTextEdit
from PyQt5.QtCore import QIODevice
from PyQt5.QtSerialPort import QSerialPort, QSerialPortInfo


class SerialDebugHelper(QMainWindow):
    def __init__(self):
        super(SerialDebugHelper, self).__init__()

        self.serial = QSerialPort()
        self.serial_port_info_list = QSerialPortInfo.availablePorts()
        self.initUI()

    def initUI(self):
        self.setWindowTitle('串口调试助手')
        self.setGeometry(300, 300, 600, 400)

        layout = QGridLayout()

        self.port_label = QLabel('串口:')
        self.baudrate_label = QLabel('波特率:')
        self.port_combo_box = QComboBox()
        self.baudrate_combo_box = QComboBox()
        self.refresh_button = QPushButton('刷新')
        self.open_button = QPushButton('打开串口')
        self.close_button = QPushButton('关闭串口')
        self.send_button = QPushButton('发送')
        self.clear_button = QPushButton('清除')
        self.send_line_edit = QLineEdit()
        self.received_text_edit = QTextEdit()

        self.refresh_serial_ports()
        self.baudrate_combo_box.addItems(['300', '1200', '2400', '4800', '9600', '19200', '38400', '57600', '115200'])
        self.baudrate_combo_box.setCurrentText('9600')  # Default to 9600

        layout.addWidget(self.port_label, 0, 0)
        layout.addWidget(self.port_combo_box, 0, 1)
        layout.addWidget(self.baudrate_label, 1, 0)
        layout.addWidget(self.baudrate_combo_box, 1, 1)
        layout.addWidget(self.refresh_button, 0, 2)
        layout.addWidget(self.open_button, 1, 2)
        layout.addWidget(self.close_button, 1, 3)
        layout.addWidget(self.received_text_edit, 2, 0, 1, 4)
        layout.addWidget(self.send_line_edit, 3, 0, 1, 3)
        layout.addWidget(self.send_button, 3, 3)
        layout.addWidget(self.clear_button, 4, 3)

        self.refresh_button.clicked.connect(self.refresh_serial_ports)
        self.open_button.clicked.connect(self.open_serial_port)
        self.close_button.clicked.connect(self.close_serial_port)
        self.send_button.clicked.connect(self.send_data)
        self.clear_button.clicked.connect(self.clear_received_data)

        central_widget = QWidget()
        central_widget.setLayout(layout)
        self.setCentralWidget(central_widget)

    def refresh_serial_ports(self):
        self.port_combo_box.clear()
        self.serial_port_info_list = QSerialPortInfo.availablePorts()
        for port in self.serial_port_info_list:
            self.port_combo_box.addItem(port.portName())

    def send_data(self):
        if self.serial.isOpen():
            data = self.send_line_edit.text().encode()
            self.serial.write(data)
            self.send_line_edit.clear()

    def clear_received_data(self):
        self.received_text_edit.clear()

    def on_serial_read(self):
        bytes_to_read = self.serial.bytesAvailable()
        text = self.serial.read(bytes_to_read).decode()
        self.received_text_edit.insertPlainText(text)

    def open_serial_port(self):
        port_name = self.port_combo_box.currentText()
        baud_rate = int(self.baudrate_combo_box.currentText())
        self.serial.setPortName(port_name)
        self.serial.setBaudRate(baud_rate)
        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.serial.readyRead.connect(self.on_serial_read)
            self.open_button.setEnabled(False)
            self.close_button.setEnabled(True)

    def close_serial_port(self):
        if self.serial.isOpen():
            self.serial.close()
            self.open_button.setEnabled(True)
            self.close_button.setEnabled(False)

    def closeEvent(self, event):
        self.close_serial_port()
        event.accept()


if __name__ == "__main__":
    app = QApplication(sys.argv)
    mainWin = SerialDebugHelper()
    mainWin.show()
    sys.exit(app.exec_())

第三步:运行结果

你可以用单片机或含串口的外设去测试,也可以下一个虚拟串口,附上网盘链接如下:

链接:https://pan.baidu.com/s/1V6w7vNGvMen6tspPJQcKiw 
提取码:1bss 
然后选择添加虚拟串口1、串口2,并且用一个现成的串口调试助手去测试;在你运行的串口助手选择串口号1,现成的串口调试助手选择串口2,并且二者波特率选择一致,就可以互相通讯了。

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

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

相关文章

酷开科技以酷开系统为媒介,打造欢乐生活场景

家人相聚在一起的时光总是那么美好,在欢聚的日子里,我们也总是希望能够让时间变得慢一点,再慢一点,但是随着春节假期的结束,很多人已经开始了新一年的忙碌,大家纷纷回到工作、学习岗位,回归之前…

Java面试题【必知必会】Mybatis常见面试题(2024)

近期一直在准备面试,所以为了巩固知识,也为了梳理,整理了一些java的基础面试题!同时也希望各位英雄和女侠能够补充!不胜荣幸!!! 1.MyBatis是什么?他的优缺点?…

第八篇 - 预测受众(Predictive audience)技术是如何赋能数字化营销生态的?- 我为什么要翻译介绍美国人工智能科技巨头IAB公司

IAB平台,使命和功能 IAB成立于1996年,总部位于纽约市。 作为美国的人工智能科技巨头社会媒体和营销专业平台公司,互动广告局(IAB- the Interactive Advertising Bureau)自1996年成立以来,先后为700多家媒…

快递通cps小程序源码

源码介绍: 快递代发快递代寄寄件小程序可以对接易达云洋一级总代快递小程序,接入云洋/易达物流接口,支持选择快递公司,三通一达,极兔,德邦等,功能成熟 如何收益: 1.对接第三方平台成本大约4元…

HTML表单标签,web前端开发新技术

1、ant-design的使用总结及常用组件和他们的基本用法? ant-design为React,Angular和Vue都提供了组件,同时为PC和移动端提供了常用的基础组件。ant-design提供的demo非常的丰富并且样式能够基本的覆盖开发需求。antd的Demo因为是多人编写的,…

从零学习Linux操作系统 第三十二部分 ansible中剧本的应用

一、什么是playbook及playbook的组成 1.Playbook的功能 playbook 是由一个或多个play组成的列表 Playboot 文件使用YAML来写的 play就是一个个模块用列表的方式体现出来 playbook的语法是用YAML的预防进行书写的 2.YAML 简介 是一种表达资料序列的格式,类似XM…

Maven对项目构建过程中的每个步骤的详细介绍

1. 概述 Maven除了管理项目的依赖以外,还能对项目的构建过程进行管理。除了使用命令行以外,我们平时经常用IDEA图形化界面进行操作,如图所示: 本文将详细描述Maven对项目构建过程中的每一个阶段。 2. 构建过程 注意&#xff1…

183基于matlab的非线性调频模态分解(VNCMD)

基于matlab的非线性调频模态分解(VNCMD),一种基于变分方法的信号分解技术,它将信号分解为多个模式。能够处理非线性调频信号,且对噪声具有较好的鲁棒性。VNCMD的基本原理是通过最小化信号与模式之间的差异来实现信号的分解。程序已调通&#…

YOLOV9论文解读

代码:https://github.com/WongKinYiu/yolov9论文:https://arxiv.org/abs/2402.1361本文提出可编程梯度信息(PGI)和基于梯度路径规划的通用高效层聚合网络(GELAN),最终铸成YOLOv9目标检测全新工作!性能表现SOTA!在各个方…

云计算 3月5号 (DNS域名解析及部署)

DNS域名解析服务 1.DNS介绍 DNS 是域名系统 (Domain Name System) 的缩写,是因特网的一项核心服务,它作为可以将域名和IP地址相互映射的一个分布式数据库,能够使人更方便的访问互联网,而不用去记住能够被机器直接读取的IP数串。…

Flutter图片内存占用过大问题

图片(Image)加载原理: Image : 显示图⽚的Widget,通过ImageState管理ImageProvider的⽣命周期。 ImageProvider: 图⽚的抽象概念。 根据Image创建实例时调用的工厂方法的不同(Image.network或者Image.assetImage&#…

设计模式:代理模式 ⑦

一、核心思想 调用方 --> 代理 ---> 目标对象 代理是调用真实目标对象的一层中间层,如果需要进行 ①、屏蔽复杂对象的创建过程,让上层调用友好感知,并起到隐藏保护的目的。 ②、一定的方法扩展增强 ③、或者在对目标对象调用…

2024.03.05作业

select实现tcp并发服务器 #include "test.h"#define SER_IP "192.168.42.106" #define SER_PORT 8888int create_socket() {int sfd socket(AF_INET, SOCK_STREAM, 0);if(sfd -1){perror("socket error");exit(-1);}printf("sfd %d\n&q…

如何使用Python操作MySQL的各种功能?高级用法?

当今互联网时代,数据处理已经成为了一个非常重要的任务。而MySQL作为一款开源的关系型数据库,被广泛应用于各种场景。本篇博客将介绍如何使用Python操作MySQL的各种功能,以及一些高级用法。 连接MySQL 在Python中,我们可以使用p…

《操作系统真相还原》读书笔记二:环境搭建 xshell连接virtualbox

修改 sshd_config 使用 vi /etc/ssh/sshd_config命令进入sshd服务配置,键盘输入i进行编辑,将监听端口、监听地址前的 # 号去除,开启允许远程登录,开启使用用户名密码来作为连接验证。修改完成,按一下Esc,输…

汽车级瞬态抑制TVS二极管优势特性及型号大全

汽车级瞬态抑制TVS二极管是一种高性能的防浪涌过电压电路保护元器件,能够在瞬态电压过高的情况下提供可靠的保护。它能够迅速响应并吸收过电压,将其导向地线,从而保护车辆的电子设备免受损坏。东沃汽车级TVS二极管具有以下几个关键优势&#…

安卓Activity的深度探索:任务栈管理、启动模式及屏幕旋转策略的分析与应用

摘要 本文旨在深入探讨安卓Activity作为Android应用架构基石的重要概念,集中研究其任务栈管理机制、启动模式以及对屏幕旋转事件的响应策略。通过对这些核心特性的详尽阐述、优劣分析以及优化方案的讨论,为开发者优化用户体验、提升应用性能提供理论指导…

蓝牙系列二:BLE协议各层的形象化理解

对于蓝牙的协议栈模型已经不再陌生,但是看过相关的文档还是有些没法理解协议栈每层的区别以及每层的功能作用。本文还是继续学习韦东山讲解的蓝牙,对于初学者还是有很好的帮助作用,下面是韦东山老师形象化协议栈的框图: 下面还是把…

[java] 23种设计模式之责任链模式

1.1例子 公司请假系统,业务逻辑如下: 不超过3天的,组长审批 超过3天且小于7天的,总监审批 超过7天且小于15天的,部长审批 超过15天,前端直接拒绝,不会进入审批流程(违反了公司的请假…

GIS之深度学习06:CUDA12安装(适配版)

CUDA(Compute Unified Device Architecture)是NVIDIA开发的并行计算平台和编程模型,用于利用NVIDIA GPU的并行计算能力,它允许开发者使用类似于C语言的编程语言编写并行程序,利用GPU的大规模并行计算能力加速各种类型的…