Overview
When an upload fails, the IDE prints the error at the bottom of the window. Most failures come down to a handful of causes, roughly in the order below. Check them in sequence.
1. The port
Tools → Port must list your board. Unplug it, look at the list, plug it in
and see which entry appears. That is your board. On Windows it is a COM number; on macOS
/dev/cu.usbmodem… or /dev/cu.usbserial…; on Linux /dev/ttyACM0 or
/dev/ttyUSB0.
No new entry at all: try another USB cable. Many cables supplied with phones and power banks carry only power, not data.
2. The board setting
Tools → Board must be Arduino Uno for an Uno R3 or a compatible clone. Choosing a different board leads to errors such as "programmer is not responding" or a wrong-signature message.
3. Drivers for clone boards
Many compatible boards use a CH340 or CP2102 USB chip instead of the original ATmega16U2. Recent Windows, macOS and Linux versions usually include drivers; if the port never appears, install the driver from the chip maker. Look at the small chip near the USB socket to see which you have.
4. Something on pins 0 and 1
Pins 0 (RX) and 1 (TX) carry the upload. A module wired to them, for example a Bluetooth or GPS board, can block it. Disconnect anything on those pins, upload, then reconnect.
5. The port is busy
Close any other program that might hold the port open: a second IDE window, a serial terminal, a 3D-printer host, or a Python script. Error text often mentions "access denied" or "port busy".
6. Linux permissions
"Permission denied" on /dev/ttyACM0 means your user cannot
access serial devices. Add yourself to the group that owns the port (usually dialout, on some
distributions uucp), then log out and back in.
7. Power problems
A circuit drawing too much current (motors, servos, a short) can make the board reset during upload. Unplug the circuit from the board and try uploading a plain Blink.
Messages you may see
| Message contains | Check first |
|---|---|
| stk500_recv(): programmer is not responding | Board setting, port, pins 0/1, cable |
| stk500_getsync(): not in sync | Same as above; also try pressing reset just as upload starts |
| Port … not found / Board at … is not available | Cable, port selection, drivers |
| Access is denied / Permission denied | Port in use by another program; Linux group membership |
| Sketch too big | Program exceeds 32 KB flash; remove libraries or text |
Still stuck
If the L LED does not blink briefly when you press the reset button, the bootloader may be missing or damaged. It can be reinstalled with a second board acting as an ISP programmer, which is a separate project. Before that, try a different computer and cable to rule them out.