Problem:
When trying to flash a ESP8266 or ESP32 board on Linux, you see an error message like
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'
Solution:
As described at the top of the error message, install the PlatformIO udev rules:
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
then restart udev
:
sudo systemctl restart udev
After that, unplug an re-plug your ESP32 board in order for the changes to take effect
Additionally, I recommend adding your user to the dialout group – the Linux group that owns most USB devices:
sudo usermod -a -G dialout $USER
In order for the changes to take effect, log out from your current session completely and log back in again (or reboot). While not strictly neccessary in order to fix this specific error message, it helps in preventing future USB permission issues.