You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.29 17:41:21