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.
Community draft — report a mistake
What you see
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 2esptool.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
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
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
Close anything holding the port
Another Arduino IDE window, CoolTerm, screen, Cura or a browser tab using Web Serial. Run
lsof | grep usbserialto see who has it. - 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
Did this fix it?
Thanks — that helps us keep this page right.