WSL2中USB串口挂载后无法读写数据的排查求助
USB串口WSL2读写故障排查方案
问题背景
已完成以下操作但Python串口代码无法读写:
- Windows端通过
usbipd list识别到USB串口设备6-4 0403:6001 USB Serial Converter,并执行usbipd attach --wsl --busid 6-4挂载到WSL2 - WSL2端通过
lsusb确认设备连接,sudo dmesg | grep tty识别到设备路径为/dev/ttyUSB0 - 运行以下Python代码无输出,读写操作失效:
import serial import time import os ser = serial.Serial('/dev/ttyUSB0') # device name on your computer print(ser.name) # check which port was really used ser.write(b'serail port on wsl \n') # write a string s = ser.readline() print(s) ser.close()
排查方向与解决方法
1. 修复设备权限问题
WSL2中普通用户默认无串口设备读写权限:
- 临时授权(重启WSL2后失效):
sudo chmod 666 /dev/ttyUSB0 - 永久授权(将用户加入
dialout组,需退出WSL2重新登录):sudo usermod -aG dialout $USER
2. 严格匹配串口参数
默认serial.Serial()的参数(波特率9600、无校验等)可能与设备要求不符,必须显式指定匹配参数,示例:
ser = serial.Serial( port='/dev/ttyUSB0', baudrate=115200, # 替换为设备实际波特率 parity=serial.PARITY_NONE, stopbits=serial.STOPBITS_1, bytesize=serial.EIGHTBITS, timeout=5 # 添加超时避免无限阻塞 )
3. 禁用硬件流控
部分USB串口默认启用RTS/CTS硬件流控,未配置会导致通信阻塞,初始化时显式禁用:
ser = serial.Serial( '/dev/ttyUSB0', baudrate=9600, rtscts=False, dsrdtr=False, timeout=5 )
4. 调试代码逻辑
- 先单独验证写入:去掉
readline(),仅保留写入操作,用其他设备监听是否收到数据 - 若写入正常,检查
readline():设备返回数据是否以\n结尾?若不是,改用ser.read(n)读取指定字节数或ser.read_all()读取缓存 - 添加异常捕获定位错误:
try: ser = serial.Serial('/dev/ttyUSB0', baudrate=9600, timeout=5) print(f"Connected to {ser.name}") ser.write(b'test command\n') time.sleep(1) # 给设备响应时间 response = ser.read_all() print(f"Response: {response}") except Exception as e: print(f"Error: {e}") finally: if 'ser' in locals() and ser.is_open: ser.close()
5. 检查WSL2内核驱动
- 确认已加载对应串口驱动模块(如FTDI设备的
ftdi_sio):lsmod | grep ftdi_sio - 未加载则手动加载:
sudo modprobe ftdi_sio - 驱动加载失败时,升级WSL2内核:
sudo apt update && sudo apt upgrade -y wsl --update
6. 重新验证usbipd挂载状态
- Windows端执行
usbipd list确认设备状态为Attached - 状态异常则重新卸载挂载:
usbipd detach --busid 6-4 usbipd attach --wsl --busid 6-4 - 确保WSL2处于运行状态时执行挂载操作
7. 用原生工具验证通信
用WSL2自带工具排除Python代码问题:
- 安装
minicom:sudo apt install minicom - 连接串口并测试:
sudo minicom -D /dev/ttyUSB0 -b 9600 # 替换为设备实际波特率 - 若minicom能正常收发数据,说明问题出在Python代码或
pyserial库
8. 更新pyserial库
旧版本pyserial可能存在WSL2兼容性问题,升级到最新版:
pip install --upgrade pyserial
内容的提问来源于stack exchange,提问作者Ecu
相关产品推荐
相关产品推荐

