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

Windows10 WSL2 Docker容器中VSCode+PlatformIO识别USB串口求助

解决Docker容器内VS Code PlatformIO识别ESP32 USB设备的问题

一、先让WSL2生成串口设备文件(/dev/ttyUSBx/ACM)

你当前WSL2里只有/dev/usb下的设备,说明串口驱动没加载,USB设备没被识别为串口:

    1. Windows端安装usbipd-win
      打开微软商店搜索usbipd-win安装,或者用PowerShell执行:
    winget install usbipd-win
    
    1. 绑定ESP32设备到WSL2
      管理员权限打开PowerShell,列出所有USB设备:
    usbipd wsl list
    
    找到ESP32对应的BusID(比如1-4),绑定到Ubuntu发行版:
    usbipd wsl attach --busid <你的设备BusID> --distro Ubuntu
    
    1. WSL2内安装依赖并加载串口驱动
      执行以下命令:
    sudo apt update && sudo apt install linux-tools-generic hwdata
    sudo update-alternatives --install /usr/local/bin/usbip usbip /usr/lib/linux-tools/*-generic/usbip 20
    
    根据你的ESP32串口芯片加载对应驱动:
    • CP210x芯片:sudo modprobe cp210x
    • CH340/CH341芯片:sudo modprobe ch341
      此时执行ls /dev应该能看到ttyUSB0或ttyACM0。

二、配置Docker容器的设备映射与权限

确保容器能访问到串口设备并拥有操作权限:

    1. 启动容器时添加设备映射
      启动容器时必须把WSL2中的串口设备映射到容器内部,同时开启足够权限:
    docker run -d --name vscode-container \
      --device /dev/ttyUSB0:/dev/ttyUSB0 \
      --group-add dialout \
      --privileged \
      <你的容器镜像名称>
    
    如果你是用VS Code Remote-Containers创建的容器,需要在.devcontainer/devcontainer.json中添加设备配置:
    "runArgs": [
      "--device=/dev/ttyUSB0:/dev/ttyUSB0",
      "--group-add=dialout",
      "--privileged"
    ]
    
    1. 容器内配置udev规则与权限
      进入容器后,先确认设备存在:ls /dev/ttyUSB0
      创建/etc/udev/rules.d/99-platformio-udev.rules文件,写入以下内容:
    SUBSYSTEM=="tty", ATTRS{idVendor}=="10c4", ATTRS{idProduct}=="ea60", MODE="0666", GROUP="dialout"
    SUBSYSTEM=="tty", ATTRS{idVendor}=="0403", ATTRS{idProduct}=="6001", MODE="0666", GROUP="dialout"
    SUBSYSTEM=="tty", ATTRS{idVendor}=="0403", ATTRS{idProduct}=="6010", MODE="0666", GROUP="dialout"
    SUBSYSTEM=="tty", ATTRS{idVendor}=="0403", ATTRS{idProduct}=="6011", MODE="0666", GROUP="dialout"
    SUBSYSTEM=="tty", ATTRS{idVendor}=="0403", ATTRS{idProduct}=="6014", MODE="0666", GROUP="dialout"
    SUBSYSTEM=="tty", ATTRS{idVendor}=="0403", ATTRS{idProduct}=="6015", MODE="0666", GROUP="dialout"
    SUBSYSTEM=="tty", ATTRS{idVendor}=="2341", MODE="0666", GROUP="dialout"
    SUBSYSTEM=="tty", ATTRS{idVendor}=="1a86", ATTRS{idProduct}=="7523", MODE="0666", GROUP="dialout"
    SUBSYSTEM=="tty", ATTRS{idVendor}=="1a86", ATTRS{idProduct}=="5523", MODE="0666", GROUP="dialout"
    SUBSYSTEM=="tty", ATTRS{idVendor}=="067b", ATTRS{idProduct}=="2303", MODE="0666", GROUP="dialout"
    SUBSYSTEM=="tty", ATTRS{idVendor}=="0502", ATTRS{idProduct}=="3200", MODE="0666", GROUP="dialout"
    SUBSYSTEM=="tty", ATTRS{idVendor}=="058f", ATTRS{idProduct}=="9254", MODE="0666", GROUP="dialout"
    SUBSYSTEM=="tty", ATTRS{idVendor}=="0483", ATTRS{idProduct}=="5740", MODE="0666", GROUP="dialout"
    SUBSYSTEM=="tty", ATTRS{idVendor}=="1366", ATTRS{idProduct}=="0101", MODE="0666", GROUP="dialout"
    SUBSYSTEM=="tty", ATTRS{idVendor}=="1366", ATTRS{idProduct}=="0105", MODE="0666", GROUP="dialout"
    SUBSYSTEM=="tty", ATTRS{idVendor}=="04d8", ATTRS{idProduct}=="00df", MODE="0666", GROUP="dialout"
    SUBSYSTEM=="tty", ATTRS{idVendor}=="04d8", ATTRS{idProduct}=="e115", MODE="0666", GROUP="dialout"
    
    然后重新加载udev规则:
    sudo udevadm control --reload-rules
    sudo udevadm trigger
    
    将当前用户加入dialout组并设置设备权限:
    sudo usermod -aG dialout $USER
    sudo chmod 666 /dev/ttyUSB0
    
    最后重启VS Code远程会话,让权限生效。

三、PlatformIO配置验证

  • 打开VS Code的PlatformIO主页,点击「Devices」,应该能识别到ttyUSB0/ttyACM0。
  • 如果仍未识别,直接在项目的platformio.ini中指定端口:
    [env:esp32dev]
    platform = espressif32
    board = esp32dev
    framework = arduino
    upload_port = /dev/ttyUSB0
    monitor_port = /dev/ttyUSB0
    

排查要点

  • 若WSL2无串口设备:执行lsmod | grep cp210x(对应你的驱动),无输出则说明驱动未加载,需更新WSL2内核(Windows设置→更新和安全→可选更新→Linux内核更新)。
  • 若容器内设备存在但PlatformIO看不到:重启PlatformIO服务(左下角PlatformIO图标→Restart PlatformIO Core)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 00:59:59