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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 03:27:20