PySerial拔下串口设备后触发异常,能否实现串口热插拔?
PySerial串口热插拔问题解决
PySerial本身不原生支持无异常的热插拔,你遇到的拔设备触发异常是3.5版本的正常行为——Win32平台下,设备断开后原有串口句柄失效,调用in_waiting这类操作会触发系统I/O错误,PySerial会将其包装为SerialException抛出。你之前遇到的“无反应”可能是旧版本PySerial或特殊场景下的表现,但当前版本确实会抛出该异常。
不过通过异常捕获+自动重连逻辑,完全可以实现热插拔后脚本继续工作,修改后的代码示例如下:
import time import serial from serial.serialutil import SerialException def connect_serial(port="COM10", baudrate=9600, timeout=0.5): try: ser = serial.Serial(port, baudrate, timeout=timeout) print(f"成功连接到 {port}") return ser except (SerialException, OSError) as e: print(f"连接失败: {e}") return None # 初始化串口连接 ser = connect_serial() while True: try: if ser and ser.is_open: # 正常读取数据 if ser.in_waiting: serial_data = ser.readline().decode('ascii').strip() print(f"Received: {serial_data}") time.sleep(0.01) else: # 尝试重新连接设备 ser = connect_serial() time.sleep(1) # 增加间隔避免频繁重试 except (SerialException, OSError) as e: print(f"串口异常: {e}") # 关闭失效的串口对象 if ser: ser.close() ser = None time.sleep(1)
关键逻辑说明:
- 把串口连接封装成独立函数,方便重复调用重连
- 主循环中捕获所有串口相关异常,出现错误时立即关闭失效的串口句柄
- 循环检测连接状态,设备插回后自动重新建立连接
如果你的设备热插拔后会变更COM端口(部分USB转串口设备会出现此情况),还可以添加串口枚举逻辑——定期扫描系统当前可用的串口列表,匹配目标设备的VID/PID或端口名称,实现更鲁棒的热插拔支持。
内容的提问来源于stack exchange,提问作者Noideas
相关产品推荐
相关产品推荐

