ESP32 업로드 오류 해결 — Failed to connect · Wrong boot mode 메시지별 원인과 조치
ESP32 에 코드를 올리다 보면 Connecting... 뒤로 점만 찍히다가 A fatal error occurred 로 끝나는 일이 흔합니다. 메시지 종류는 몇 가지뿐이고, 각각이 업로드 과정의 어느 단계에서 멈췄는지를 알려 줍니다. esptool 소스 코드에 들어 있는 실제 문구를 기준으로, 메시지마다 무엇을 확인하면 되는지 순서대로 정리했습니다.
EN 을 눌러 부팅 로그(boot:0x13 / boot:0x3)를 확인할 때 쓰기 좋고, DTR 토글로 불필요한 리셋 없이 포트를 엽니다. 업로드할 때는 포트 연결을 해제해 비워 주세요.
업로드는 네 단계 — 메시지로 멈춘 곳 찾기
Arduino IDE, PlatformIO, ESP-IDF 는 모두 내부에서 esptool 로 업로드합니다. esptool 은 먼저 포트를 열고, DTR·RTS 신호로 칩을 리셋해 다운로드 모드로 보낸 뒤, 칩과 동기화(sync)를 맞추고, 그다음에야 플래시에 데이터를 씁니다. 오류 메시지는 이 가운데 어느 단계에서 멈췄는지를 말해 주므로, 문구만 보고도 확인할 곳을 절반 이상 줄일 수 있습니다.
| 메시지 | 멈춘 단계 | 먼저 볼 것 |
|---|---|---|
Could not open COM3, the port is busy or doesn't exist. | ① 포트 열기 | 포트를 쓰는 다른 프로그램, 포트 번호, 드라이버 |
Wrong boot mode detected (0x13)! The chip needs to be in download mode. | ② 다운로드 모드 | BOOT 버튼, GPIO0·GPIO2 에 연결된 부품 |
No serial data received. | ③ 응답 없음 | 수동 다운로드 모드, 케이블, 전원 |
Download mode successfully detected, but getting no sync reply: The serial TX path seems to be down. | ③ 동기화 | PC→ESP32 방향 배선(TX→RX) |
Invalid head of packet (0x…): Possible serial noise or corruption. | ④ 전송 중 | 업로드 속도 낮추기, 케이블·허브 |
메시지 앞에는 A fatal error occurred: 가 붙고, 연결 단계 오류에는 Failed to connect to ESP32: 가 한 번 더 붙습니다. 칩 이름은 보드에 따라 ESP32-S3, ESP32-C3 처럼 바뀝니다.
Could not open COM3 — 포트를 열지 못함
A fatal error occurred: Could not open COM3, the port is busy or doesn't exist.
(could not open port 'COM3': PermissionError(13, 'Access is denied.', None, 5))
Hint: Check if the port is not used by another task둘째 줄 괄호 안이 진짜 원인입니다. PermissionError(13, …) 는 다른 프로그램이 포트를 쓰고 있다는 뜻이고, FileNotFoundError(2, …) 는 그 번호의 포트가 없다는 뜻입니다. 업로드와 시리얼 통신은 한 포트를 동시에 쓸 수 없습니다.
- PuTTY, 시리얼 터미널, 다른 IDE 창의 시리얼 모니터처럼 같은 포트를 연 프로그램을 닫습니다.
- 장치 관리자 → 포트(COM & LPT)를 연 채로 보드를 뽑았다 꽂아 보세요. 그때 사라졌다 나타나는 번호가 실제 포트입니다.
- 목록에 아예 안 보이면 보드의 USB 칩 드라이버를 설치합니다. CP2102·CP210x 는 Silicon Labs, CH340 은 WCH 에서 배포합니다.
- 충전 전용 USB 케이블은 전원만 들어오고 포트가 생기지 않습니다. 데이터 선이 있는 케이블로 바꿔 보세요.
한국어 윈도우에서는 괄호 안 설명이 액세스가 거부되었습니다 처럼 한국어로 나옵니다. esptool 의 Hint 줄은 영어 문구(Access is denied)를 찾아서 붙는 방식이라, 한국어 윈도우에서는 포트 사용 중일 때 Hint 줄이 보이지 않을 수 있습니다. 리눅스에서 Permission denied 가 나오면 계정을 dialout(배포판에 따라 uucp) 그룹에 추가하세요.
No serial data received — 칩이 아무 대답도 하지 않음
Connecting........
A fatal error occurred: Failed to connect to ESP32: No serial data received.
For troubleshooting steps visit: https://docs.espressif.com/projects/esptool/en/latest/troubleshooting.html포트는 열렸지만, esptool 이 칩을 리셋하고 기다리는 동안 데이터가 한 바이트도 돌아오지 않은 경우입니다. PC 와 USB 칩 사이는 정상이니, USB 칩과 ESP32 사이의 연결이나 칩의 상태를 봐야 합니다. 아래 순서대로 확인하세요.
- 1수동 다운로드 모드: 업로드를 누르고
Connecting...이 보이는 동안 BOOT 버튼을 누르고 있습니다. 그래도 안 되면 BOOT 를 누른 채 EN 을 한 번 눌렀다 뗍니다.Writing at 0x…가 나오기 시작하면 BOOT 를 떼도 됩니다. - 2USB 허브나 본체 앞면 포트 대신 뒷면 포트에 직접 꽂고, 짧은 데이터 케이블로 바꿔 봅니다.
- 3전원: esptool 문서는 ESP32 의 3.3V 전원이 최대 200~300mA 의 순간 전류를 감당해야 한다고 안내합니다. 모터·LED 스트립처럼 전류를 많이 쓰는 부품이 보드에 연결돼 있다면 떼고 시도합니다.
- 4개발 보드가 아니라 모듈을 USB-시리얼 어댑터에 직접 연결했다면 어댑터 TX 가 ESP32 RX 로, 어댑터 RX 가 ESP32 TX 로 교차 연결됐는지, GND 가 공통인지 확인합니다.
- 5업로드 속도를 115200 으로 낮춥니다(아래 '전송 중 오류' 절 참고).
Wrong boot mode detected (0x13) — 다운로드 모드로 못 들어감
A fatal error occurred: Failed to connect to ESP32: Wrong boot mode detected (0x13)! The chip needs to be in download mode.이 메시지는 반쯤은 좋은 소식입니다. esptool 이 칩의 부팅 로그를 읽었으니 통신선은 살아 있습니다. 다만 칩이 다운로드 모드가 아니라 평소처럼 플래시의 프로그램으로 부팅했습니다. esptool 은 리셋 직후 들어온 부팅 로그에 waiting for download 가 있는지를 보고 다운로드 모드 여부를 판단합니다.
- 가장 빠른 해결:
Connecting...동안 BOOT 를 누르고 있습니다(위 절의 수동 다운로드 모드). - GPIO0·GPIO2 에 버튼, LED, 센서를 연결했다면 떼고 시도합니다. GPIO0 을 외부에서 HIGH 로 붙잡으면 다운로드 모드로 못 들어가고, GPIO2 는 다운로드 모드에 들어갈 때 연결하지 않거나 LOW 여야 합니다.
- GPIO12 를 외부에서 HIGH 로 올려 두면 플래시 전압이 1.8V 로 잡혀, 3.3V 플래시를 쓰는 보드에서 문제가 생깁니다. 이 핀에 풀업을 달았다면 확인하세요.
- 매번 BOOT 를 눌러야만 된다면 보드의 자동 리셋 회로나 USB 허브 쪽 타이밍 문제일 가능성이 큽니다. 다른 케이블·USB 포트에서도 같은지 비교해 보세요.
괄호 안 값은 칩 종류에 따라 다르고, 핵심은 The chip needs to be in download mode 입니다. 직접 확인하려면 시리얼 모니터를 115200 으로 열고 EN 을 눌러 보세요. boot:0x13 (SPI_FAST_FLASH_BOOT) 이면 일반 부팅, boot:0x3 (DOWNLOAD_BOOT…) 와 waiting for download 가 보이면 다운로드 모드입니다.
no sync reply — PC 에서 ESP32 로 가는 선이 끊김
A fatal error occurred: Failed to connect to ESP32: Download mode successfully detected, but getting no sync reply: The serial TX path seems to be down.다운로드 모드 진입까지는 성공했는데, esptool 이 보낸 동기화 신호에 칩이 답하지 않는 경우입니다. 칩의 부팅 로그는 PC 로 잘 들어왔으니 PC 에서 ESP32 로 가는 방향만 끊긴 셈입니다. esptool 문서도 이 메시지를 호스트에서 칩으로 가는 TX 경로 문제로 설명합니다.
- USB-시리얼 어댑터를 쓴다면 어댑터 TX → ESP32 RX(ESP32 는 GPIO3, U0RXD) 연결과 점퍼선 접촉을 확인합니다.
- 개발 보드에서 이 메시지가 나오는 일은 드뭅니다. 같은 케이블·PC 로 다른 보드가 올라가는지 비교해 보드 쪽 문제인지 가립니다.
전송 중 오류 — Invalid head of packet · Serial data stream stopped
A fatal error occurred: Invalid head of packet (0x…): Possible serial noise or corruption.
A fatal error occurred: Serial data stream stopped: Possible serial noise or corruption.업로드가 시작돼 퍼센트가 올라가다가 끊기는 경우입니다. esptool 문서가 꼽는 원인은 품질이 낮은 USB 케이블, 브레드보드에서 핀끼리 닿는 경우, 칩의 전원 부족(brownout)입니다. 공통 해결책은 업로드 속도를 낮추는 것입니다. 속도를 낮추면 업로드 시간은 늘어나지만 잡음에 훨씬 강해집니다.
| 환경 | 업로드 속도 바꾸는 곳 |
|---|---|
| Arduino IDE | 툴 → Upload Speed → 115200 |
| PlatformIO | platformio.ini 에 upload_speed = 115200 |
| ESP-IDF | idf.py -p COM3 -b 115200 flash |
| esptool 직접 | -b 115200 옵션 (문서는 원인 확인용으로 -b 9600 까지 안내) |
- 짧은 데이터 케이블로 바꾸고, 허브 대신 PC 포트에 직접 연결합니다.
- 브레드보드에 모듈을 꽂아 쓴다면 플래시에 연결된 핀(ESP32 는 GPIO6~11)에 다른 선이나 부품이 닿지 않게 합니다.
- 전류를 많이 쓰는 부품은 업로드하는 동안 떼거나 별도 전원으로 분리합니다.
빠르게 찾는 순서
- 1
Could not open→ 포트를 쓰는 프로그램 닫기, 포트 번호·드라이버·케이블 확인. - 2
Wrong boot mode→Connecting...동안 BOOT 누르기, GPIO0·GPIO2·GPIO12 에 연결된 부품 확인. - 3
No serial data received→ 수동 다운로드 모드, 케이블·USB 포트, 전원 확인. - 4
no sync reply→ PC→ESP32 방향 배선(TX→RX) 확인. - 5업로드 도중
Invalid head of packet→ 속도 115200, 케이블·허브·전원 확인.
업로드가 끝났는데 프로그램이 돌지 않으면 EN 을 한 번 누르세요. 시리얼 모니터를 열 때마다 보드가 리셋되는 문제는 블로그의 다른 글 'ESP32가 시리얼 모니터를 열 때마다 리셋되는 이유와 해결'에 따로 정리했습니다.
자주 묻는 질문
Q. 매번 BOOT 버튼을 눌러야만 업로드됩니다. 고장인가요?
고장은 아닙니다. 자동 업로드는 USB 칩의 DTR·RTS 신호로 GPIO0 과 EN 을 차례로 조작하는데, 보드 회로나 USB 허브에 따라 이 타이밍이 어긋나면 다운로드 모드 진입에 실패합니다. 다른 케이블·USB 포트·PC 에서도 같은지 비교해 보고, 같다면 그 보드의 특성으로 보고 BOOT 를 누르는 방식으로 쓰면 됩니다.
Q. 업로드는 성공했는데 프로그램이 실행되지 않습니다.
업로드 직후 칩이 다운로드 모드에 머물러 있는 경우가 많습니다. EN 을 한 번 누르세요. ESP32-S3·C3 의 칩 내장 USB 포트로 올렸다면 그 리셋이 부팅 모드 핀을 다시 읽지 않아서 이런 일이 생길 수 있고, esptool 의 --after watchdog-reset 옵션으로도 해결됩니다.
Q. ESP32-S3 보드에 USB 포트가 두 개인데 어느 쪽으로 올리나요?
보통 한쪽은 USB-시리얼 칩(UART, COM 표시)이고 다른 쪽은 칩 내장 USB 입니다. 둘 다 업로드할 수 있지만, 프로그램이 내장 USB 핀을 다른 용도로 바꾸거나 기능을 끄면 그 포트가 PC 에서 사라집니다. 그럴 때는 BOOT 를 누른 채 EN 을 눌러 다운로드 모드로 들어가면 포트가 다시 보입니다.
Q. 포트 번호가 자꾸 바뀝니다.
윈도우는 USB 칩과 꽂은 USB 포트에 따라 COM 번호를 새로 줄 수 있습니다. 같은 보드를 같은 USB 포트에 꽂으면 보통 같은 번호가 유지되니, 장치 관리자에서 보드를 뽑았다 꽂으며 현재 번호를 확인하세요.
Q. Arduino IDE 에서 Upload Speed 메뉴가 안 보입니다.
툴 메뉴의 Upload Speed 는 보드를 ESP32 계열로 선택했을 때 나타납니다. 툴 → 보드에서 ESP32 Dev Module 처럼 사용하는 보드가 선택돼 있는지 먼저 확인하세요.
EN 을 눌러 부팅 로그(boot:0x13 / boot:0x3)를 확인할 때 쓰기 좋고, DTR 토글로 불필요한 리셋 없이 포트를 엽니다. 업로드할 때는 포트 연결을 해제해 비워 주세요.