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

USB重连后无法重新打开Serial Port的问题求助

USB断开重连后串口重开失败的解决方法

问题重现

当USB串口设备断开并重新连接后,复用原有串口对象尝试重新打开时,会抛出"资源已被占用"的IOException(.NET)或类似异常(Python)。

.NET 测试代码

Console.WriteLine("Hello, World!");
SerialPort sp = new SerialPort("COM6",115200, Parity.None, 8, StopBits.One);
sp.Open();
Console.WriteLine("OPEN");
await Task.Delay(5000); // 此处断开USB
sp.Close();
Console.WriteLine("CLOSE");
await Task.Delay(5000); // 此处重新连接USB
sp.Open(); // 抛出IOException:资源已被占用
Console.WriteLine("OPEN");

Python 测试代码

import serial as s
import time

ser = s.Serial('COM6',115200,parity=s.PARITY_NONE,\
        stopbits=s.STOPBITS_ONE,\
        bytesize=s.EIGHTBITS)

print('Open')
time.sleep(5) # 此处断开USB
ser.close()
print('close')
time.sleep(5) # 此处重新连接USB
ser.open() # 抛出异常
print('open')

问题原因

USB意外断开时,系统底层的串口资源无法被原有串口对象完全释放。即使调用了Close()方法,由于设备已离线,系统无法完成完整的资源回收流程,导致原有对象保留了对旧串口资源的无效引用,重新连接后尝试打开时会被判定为资源占用。

解决方案

核心思路是不要复用原有串口对象,重新连接后创建新的串口实例,并确保旧对象的资源被彻底释放。

.NET 修复代码

Console.WriteLine("Hello, World!");
SerialPort sp = new SerialPort("COM6",115200, Parity.None, 8, StopBits.One);
sp.Open();
Console.WriteLine("OPEN");
await Task.Delay(5000); // 断开USB
sp.Close();
sp.Dispose(); // 显式释放旧对象资源
Console.WriteLine("CLOSE");
await Task.Delay(5000); // 重新连接USB
// 创建新的SerialPort实例
sp = new SerialPort("COM6",115200, Parity.None, 8, StopBits.One);
sp.Open();
Console.WriteLine("OPEN");

Python 修复代码

import serial as s
import time

ser = s.Serial('COM6',115200,parity=s.PARITY_NONE,
        stopbits=s.STOPBITS_ONE,
        bytesize=s.EIGHTBITS)

print('Open')
time.sleep(5) # 断开USB
ser.close()
ser = None # 释放旧对象引用,触发垃圾回收
print('close')
time.sleep(5) # 重新连接USB
# 创建新的Serial实例
ser = s.Serial('COM6',115200,parity=s.PARITY_NONE,
        stopbits=s.STOPBITS_ONE,
        bytesize=s.EIGHTBITS)
print('open')

额外提示

  • 断开设备后,务必显式释放旧串口对象的资源,避免无效引用残留。
  • 可以在重新打开前添加串口存在性检测逻辑,进一步提升代码稳定性。

内容的提问来源于stack exchange,提问作者LexFerrinson

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 13:15:19