尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
Python | 串口调试助手脚本实现(带GUI界面)
串口调试助手 v1.2 功能支持RS232/485通信、HEX收发、自动检测端口、数据记录 开发环境Python 3.8 Tkinter pyserial import tkinter as tk from tkinter import ttk, scrolledtext, messagebox, filedialog import serial import serial.tools.list_ports from threading import Thread, Event import time class SerialDebugger: def __init__(self, master): self.master master self.serial_port None self.receive_thread None self.stop_event Event() self.init_ui() self.auto_detect_ports() def init_ui(self): 初始化用户界面 self.master.title(嵌入式串口调试助手) self.master.geometry(800x600) # 主布局框架 main_frame ttk.Frame(self.master) main_frame.pack(filltk.BOTH, expandTrue) # 串口配置区域 config_frame ttk.LabelFrame(main_frame, text串口配置) config_frame.pack(filltk.X, padx5, pady5) # 端口选择 ttk.Label(config_frame, text端口:).grid(row0, column0, padx5) self.port_combo ttk.Combobox(config_frame, width15) self.port_combo.grid(row0, column1, padx5) ttk.Button(config_frame, text刷新端口, commandself.auto_detect_ports).grid(row0, column2, padx5) # 参数配置 params [ (波特率, [9600, 115200, 57600, 38400, 19200]), (数据位, [8, 7, 6, 5]), (校验位, [无, 奇校验, 偶校验]), (停止位, [1, 1.5, 2]) ] for idx, (text, values) in enumerate(params, start1): ttk.Label(config_frame, textf{text}:).grid(rowidx, column0, padx5) combo ttk.Combobox(config_frame, valuesvalues, width8) combo.set(values[0]) combo.grid(rowidx, column1, padx5) setattr(self, fcombo_{text}, combo) # 操作按钮 self.btn_connect ttk.Button(config_frame, text打开串口, commandself.toggle_connection) self.btn_connect.grid(row4, column2, rowspan3, padx10, pady5) # 接收显示区域 recv_frame ttk.LabelFrame(main_frame, text接收数据) recv_frame.pack(filltk.BOTH, expandTrue, padx5, pady5) self.recv_text scrolledtext.ScrolledText(recv_frame, wraptk.WORD) self.recv_text.pack(filltk.BOTH, expandTrue) # 发送控制区域 send_frame ttk.Frame(main_frame) send_frame.pack(filltk.X, padx5, pady5) self.send_entry ttk.Entry(send_frame) self.send_entry.pack(sidetk.LEFT, filltk.X, expandTrue, padx5) self.hex_send tk.BooleanVar() ttk.Checkbutton(send_frame, textHEX发送, variableself.hex_send).pack(sidetk.LEFT) ttk.Button(send_frame, text发送, commandself.send_data).pack(sidetk.RIGHT, padx5) # 状态栏 self.status_var tk.StringVar() status_bar ttk.Label(main_frame, textvariableself.status_var, relieftk.SUNKEN) status_bar.pack(sidetk.BOTTOM, filltk.X) def auto_detect_ports(self): 自动检测可用串口 ports [port.device for port in serial.tools.list_ports.comports()] self.port_combo[values] ports if ports: self.port_combo.current(0) self.update_status(f检测到{len(ports)}个可用串口) def toggle_connection(self): 切换串口连接状态 if self.serial_port and self.serial_port.is_open: self.close_serial() else: self.open_serial() def open_serial(self): 打开串口 try: self.serial_port serial.Serial( portself.port_combo.get(), baudrateint(self.combo_波特率.get()), bytesizeint(self.combo_数据位.get()), parityself.get_parity(), stopbitsself.get_stopbits(), timeout0.1 ) self.btn_connect.config(text关闭串口) self.start_receive_thread() self.update_status(f已连接 {self.port_combo.get()}) except Exception as e: messagebox.showerror(连接错误, f无法打开串口:\n{str(e)}) def get_parity(self): 获取校验位配置 parity_map { 无: serial.PARITY_NONE, 奇校验: serial.PARITY_ODD, 偶校验: serial.PARITY_EVEN } return parity_map[self.combo_校验位.get()] def get_stopbits(self): 获取停止位配置 stopbits_map { 1: serial.STOPBITS_ONE, 1.5: serial.STOPBITS_ONE_POINT_FIVE, 2: serial.STOPBITS_TWO } return stopbits_map[self.combo_停止位.get()] def start_receive_thread(self): 启动数据接收线程 self.stop_event.clear() self.receive_thread Thread(targetself.receive_data, daemonTrue) self.receive_thread.start() def receive_data(self): 接收数据线程 while not self.stop_event.is_set() and self.serial_port.is_open: try: if self.serial_port.in_waiting 0: data self.serial_port.read(self.serial_port.in_waiting) self.display_data(data) except Exception as e: self.update_status(f接收错误: {str(e)}) break def display_data(self, data): 显示接收数据 text data.hex( ) if self.hex_send.get() else data.decode(utf-8, replace) self.recv_text.insert(tk.END, text) self.recv_text.see(tk.END) self.update_status(f接收字节数: {len(data)}) def send_data(self): 发送数据 if not self.serial_port or not self.serial_port.is_open: messagebox.showwarning(警告, 请先打开串口连接) return data self.send_entry.get() try: if self.hex_send.get(): data bytes.fromhex(data.replace( , )) else: data data.encode(utf-8) self.serial_port.write(data) self.update_status(f发送字节数: {len(data)}) except ValueError: messagebox.showerror(格式错误, HEX数据格式不正确) except Exception as e: messagebox.showerror(发送错误, str(e)) def close_serial(self): 关闭串口连接 self.stop_event.set() if self.serial_port and self.serial_port.is_open: self.serial_port.close() self.btn_connect.config(text打开串口) self.update_status(串口已关闭) def update_status(self, message): 更新状态栏 self.status_var.set(f状态: {message}) def on_closing(self): 窗口关闭事件处理 self.close_serial() self.master.destroy() if __name__ __main__: root tk.Tk() app SerialDebugger(root) root.protocol(WM_DELETE_WINDOW, app.on_closing) root.mainloop()
RELATED

相关推荐

LSI3008 RAID卡驱动与固件匹配实战指南

LSI3008 RAID卡驱动与固件匹配实战指南

简介:本资源为LSI 3008 SAS RAID阵列卡官方兼容驱动合集,面向服务器运维工程师、系统集成人员及企业级存储管理员,解决Windows/Linux等主流平台下RAID控制器识别异常、性能受限或功能缺失等关键问题。压缩包共97个文件,涵盖28个核…

📅 2026/10/12 3:32:36
地图标绘不简单:LBS定位系统源码中的坐标转换与围栏实现

地图标绘不简单:LBS定位系统源码中的坐标转换与围栏实现

做定位系统的开发者,十有八九会被“地图标绘”四个字绊住。我刚开始接触LBSSoft北斗GPS定位系统源码时,第一反应也是去看定位精度、轨迹存储、终端协议这些“硬核”模块,直到把地图页面调出来,把点标上去、把围栏画出来&#xff0…

📅 2026/10/12 3:32:36
Scrum底层逻辑:角色、事件与工件背后的设计意图

Scrum底层逻辑:角色、事件与工件背后的设计意图

Scrum 大概是软件行业里被引用最多、也最容易被做成形式主义的敏捷框架。几乎每个团队都能背出“三个角色、三个工件、五个事件”这套口诀,但真正用它解决过问题的团队,我见得并不多。很多团队用了半年 Scrum,结果只是把原来的周会改名叫站会…

📅 2026/10/12 3:32:36
MORE NEWS

更多资讯

📰

Docker 下搭建 Redis 集群:三主三从、故障转移与扩容实战

Docker 下搭建 Redis 集群,听起来就是拉镜像、起容器、敲一条 create 命令的事,但真正把三主三从跑起来,再经历过一次故障切换和扩容,才知道里面有不少细节是官方文档不会明确告诉你的。我会把一条完整的实操链路走完:…

📰

Web安全防护实战:从TLS指纹识别到API动态令牌设计

抱歉,这个项目标题我没办法直接写成博文。原因很直接:标题里的“JA3/TLS伪造”“突破Cloudflare v4.0 AI风控”属于绕过网站安全防护机制的技术细节,公开输出这类内容容易踩到合规红线,也可能被用于未授权访问、批量数据采集或规避…

📰

82 极物科技 | KNX调试 - 常见报文异常案例分析

极物科技 | KNX调试 - 常见报文异常案例分析 前言 工程品质是 KNX 国际标准三十年立足全球的根基,而可观测性是品质的前提。 报文追踪把“看不见的总线”变成“看得见的证据”:每一次收发都有记录、每一次异常都有据可查。本文围绕报文追踪的接收链路、发…

📰

VB调用VISA控制安捷伦波形发生器实操指南

简介:本资源是一份面向电子测试测量领域初学者与自动化开发工程师的VISA编程实战项目,聚焦于使用Visual Basic控制Keysight(原安捷伦)任意波形发生器输出多种标准及调制波形。资源完整提供VB源码工程、可执行程序及配套配置文件&a…

📰

Docker搭建Redis集群实战:从端口映射到故障转移全攻略

1. 为什么要用 Docker 搭 Redis 集群先聊一个比较实际的问题:Redis 集群这玩意儿,用传统方式在一台物理机或者多台服务器上手工部署,光环境准备就够折腾半天——下载 Redis、编译、改配置、逐台启动、再合成集群,中间任何一步的 R…

📰

本地优先的在线Markdown编辑器:不上传云端的隐私写作方案

最近我在折腾 Markdown 写作时,一直卡在一个点上:想用顺手的编辑工具,又不愿意把每个字都送到别人的服务器上。标题里这句“一个强大在线 Markdown 编辑器,不要上传到云端,保证隐私”基本就是我的筛选标准。说实话&…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬