如何修复 Linux ESP32 PlatformIO PermissionError: [Errno 13] Permission denied: '/dev/ttyUSB0'

问题:

尝试在 Linux 上刷写 ESP8266ESP32 板时,你看到类似这样的错误消息

platformio_permission_error.txt
Warning! Please install `99-platformio-udev.rules`.
More details: https://docs.platformio.org/page/faq.html#platformio-udev-rules

Auto-detected: /dev/ttyUSB0
Uploading .pio/build/esp32dev/firmware.bin
esptool.py v3.1
Serial port /dev/ttyUSB0
Traceback (most recent call last):
  File "/home/uli/.platformio/penv/lib/python3.8/site-packages/serial/serialposix.py", line 322, in open
    self.fd = os.open(self.portstr, os.O_RDWR | os.O_NOCTTY | os.O_NONBLOCK)
PermissionError: [Errno 13] Permission denied: '/dev/ttyUSB0'

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/home/uli/.platformio/packages/tool-esptoolpy/esptool.py", line 4582, in <module>
    _main()
  File "/home/uli/.platformio/packages/tool-esptoolpy/esptool.py", line 4575, in _main
    main()
  File "/home/uli/.platformio/packages/tool-esptoolpy/esptool.py", line 4074, in main
    esp = esp or get_default_connected_device(ser_list, port=args.port, connect_attempts=args.connect_attempts,
  File "/home/uli/.platformio/packages/tool-esptoolpy/esptool.py", line 120, in get_default_connected_device
    _esp = chip_class(each_port, initial_baud, trace)
  File "/home/uli/.platformio/packages/tool-esptoolpy/esptool.py", line 313, in __init__
    self._port = serial.serial_for_url(port)
  File "/home/uli/.platformio/penv/lib/python3.8/site-packages/serial/__init__.py", line 90, in serial_for_url
    instance.open()
  File "/home/uli/.platformio/penv/lib/python3.8/site-packages/serial/serialposix.py", line 325, in open
    raise SerialException(msg.errno, "could not open port {}: {}".format(self._port, msg))
serial.serialutil.SerialException: [Errno 13] could not open port /dev/ttyUSB0: [Errno 13] Permission denied: '/dev/ttyUSB0'

解决方案

如错误消息顶部所述,安装 PlatformIO udev 规则

install_platformio_udev_rules.sh
curl -fsSL https://raw.githubusercontent.com/platformio/platformio-core/master/scripts/99-platformio-udev.rules | sudo tee /etc/udev/rules.d/99-platformio-udev.rules

然后重启 udev

restart_udev.sh
sudo systemctl restart udev

之后,拔下并重新插入你的 ESP32 板以使更改生效

此外,我建议将你的用户添加到 dialout 组 - 拥有大多数 USB 设备的 Linux 组:

add_user_dialout.sh
sudo usermod -a -G dialout $USER

为了使更改生效,从当前会话完全注销并重新登录(或重启)。虽然不是修复此特定错误消息所严格必需的,但它有助于防止未来的 USB 权限问题。


Check out similar posts by category: Electronics, Embedded, ESP8266/ESP32, PlatformIO