Preview build — page text is a draft awaiting human review. Code badges come from real compiles. The flasher is real but not yet hardware-tested; the Playground is still a preview.
Upload error · macOS

Fix “[Errno 16] Resource busy: '/dev/cu.wchusbserial…'” on macOS

On macOS a CH340 board can appear twice — Apple's driver and WCH's driver fight over it. Use one driver, pick the cu.usbserial port and close other serial apps.

ESP32 (CH340)NodeMCU ESP8266Arduino Nano (clone)ESP32-CAM-MBUpdated 3 Nov 2026

Community draft — report a mistake

What you see

OutputOutput
esptool.py v4.8.1
Serial port /dev/cu.wchusbserial1420

A fatal error occurred: Could not open /dev/cu.wchusbserial1420, the port is busy or doesn't exist.
([Errno 16] could not open port /dev/cu.wchusbserial1420: [Errno 16] Resource busy: '/dev/cu.wchusbserial1420')

Failed uploading: uploading error: exit status 2

errno 16 means the port is already open, often by a second copy of the same driver rather than by another app. On Macs the CH340 used on clone boards is the usual case: Apple’s built-in driver and an older WCH driver both claim it, and you see two ports for one board.

Pick the cu.usbserial port, remove the old driver, and the error goes away.

Quick fix — try in order

  1. 1

    Select the cu.usbserial port instead

    macOS 11 and later include their own CH34x driver, which creates /dev/cu.usbserial-1420. If an old WCH driver is also installed you get a second cu.wchusbserial port for the same board. Try the other one.

  2. 2

    Remove the old WCH kernel extension

    If you installed the WCH driver years ago, uninstall it (WCH's package includes an uninstaller, or remove /Library/Extensions/usbserial.kext and reboot). Keep only Apple's built-in driver or only the current WCH DriverKit app — never both.

  3. 3

    Close anything holding the port

    Another Arduino IDE window, CoolTerm, screen, Cura or a browser tab using Web Serial. Run lsof | grep usbserial to see who has it.

  4. 4

    Unplug and replug

    A crashed upload can leave the port locked until the device re-enumerates.

Why it happens

Why two ports for one board?

Each driver that claims the chip publishes its own device file. Both drivers then try to own the same USB device; whichever lost returns “Resource busy”.

Use cu.* or tty.*?

Always cu.* on macOS for uploading. tty.* waits for a carrier signal and can hang.

Board-specific notes

CP2102 boards: Silicon Labs boards appear as /dev/cu.SLAB_USBtoUART (their driver) or /dev/cu.usbserial-0001 (Apple's). The same “one driver only” rule applies.

Drivers — official sources only

↑↓ to move · Enter to open