124_시리얼포트의_하드웨어비밀 🔌🕵️

도로시와 지니가 함께하는 UART 비동기 통신 규격, TX/RX 교차 배선 및 아두이노 메가 다중 시리얼 포트 심층 분석
- 👧 도로시: “지니야! 아두이노가 컴퓨터와 USB로 대화할 때 쓰는 포트로 다른 아두이노 친구와도 직접 대화를 나눌 수 있어?”
- 🐱 지니: “그럼! 아두이노 우노의 디지털 0번(RX)과 1번(TX) 핀이 바로 전 세계 모든 컴퓨터의 공용 언어인 하드웨어 UART 시리얼 통로란다!”
-
🐶 토토: “바우! 0번은 남의 말을 듣는 귀(RX), 1번은 내 생각을 말하는 입(TX)이다 멍!”
- 🖥️ 강의 슬라이드: slides.md
1. 아두이노의 기본 하드웨어 통신 핀 (UNO 기준)

📌 디지털 0번과 1번 핀의 정체: 하드웨어 UART
- Digital 0번 (RX - Receiver):
- 상대방 장치가 보낸 직렬 데이터 비트들을 귀 기울여 수신(듣기) 하는 핀입니다.
- Digital 1번 (TX - Transmitter):
- 내가 상대방에게 보내고 싶은 데이터를 한 비트씩 차례대로 송신(말하기) 하는 핀입니다.
- 보드 내부의 USB 변환 칩(ATmega16U2):
- 0번과 1번 핀은 아두이노 기판 내부에서 컴퓨터 USB 포트와 직결되어 있습니다.
- 따라서 스케치 코드를 업로드하거나 PC 시리얼 모니터로 글자를 출력할 때 이 두 핀이 실시간으로 사용됩니다.
2. UART 패킷 프레임 구조와 비동기 전송 규격

⏱️ 공통 클럭선 없이도 통신이 가능한 비결
UART(Universal Asynchronous Receiver-Transmitter)는 별도의 클럭(동기) 신호선이 없는 비동기(Asynchronous) 통신입니다:
- 아이들 상태 (Idle State): 통신이 없을 때는 통신선이 항상
HIGH (5V)를 유지합니다. - 시작 비트 (Start Bit): 데이터를 보내기 직전, 1비트 동안 전압을
LOW (0V)로 떨어뜨려 상대방에게 “데이터 전송 시작!”을 알립니다. - 데이터 비트 (Data Bits): 보통 8비트(1바이트, LSB 우선) 의 데이터가 사전에 합의된 보드레이트(Baud Rate) 타이밍에 맞춰 순서대로 흘러갑니다.
- 정지 비트 (Stop Bit): 데이터 전송이 끝나면 다시 전압을
HIGH (5V)로 올려 다음 바이트를 위한 대기 상태로 복귀합니다.
3. 하드웨어 시리얼 1:1 교차 연결(Cross-Wiring) 원칙

🤝 귀와 입을 X자로 교차해 연결해요!
시리얼 통신을 연결할 때 가장 많이 범하는 실수는 TX끼리, RX끼리 나란히 꽂는 것입니다:
| 송신 보드 (아두이노 A) | 연결 방향 | 수신 보드 (아두이노 B) | 연결 이유 및 설명 |
|---|---|---|---|
| TX (디지털 1번) | ➡️ | RX (디지털 0번) | A의 입(말하기)에서 나온 신호가 B의 귀(듣기)로 쏙! |
| RX (디지털 0번) | ⬅️ | TX (디지털 1번) | B의 입에서 나온 응답 신호를 A의 귀로 수신! |
| GND (공통 접지) | ➗ | GND (공통 접지) | 두 보드의 0V 기준 전위를 일치시키는 절대 필수선! |
4. 대형 프로젝트를 위한 아두이노 Mega 2560의 4개 시리얼 포트

🌟 하드웨어 시리얼 통로가 4쌍이나 탑재된 메가 보드!
- 아두이노 우노(UNO)는 하드웨어 시리얼이 1쌍(
Serial)뿐이어서 PC와 통신하면서 동시에 블루투스나 다른 아두이노와 통신하기가 까다롭습니다. - 아두이노 메가 2560(Mega) 은 독립된 하드웨어 시리얼이 4쌍 제공됩니다:
Serial: 0번(RX0) & 1번(TX0) ➡️ USB PC 시리얼 모니터 및 코드 업로드 전용Serial1: 19번(RX1) & 18번(TX1) ➡️ 다른 아두이노 보드와 1:1 직결 통신Serial2: 17번(RX2) & 16번(TX2) ➡️ 블루투스(HC-06) 통신Serial3: 15번(RX3) & 14번(TX3) ➡️ GPS 모듈 또는 열전사 프린터 연결
5. 아두이노 내장 Serial 클래스의 핵심 API 요약

| 함수 이름 | 매개변수 / 반환값 | 주요 역할 |
|---|---|---|
Serial.begin(baud) |
9600, 115200 등 | 통신 속도(보드레이트)를 설정하고 통신 포트 초기화 |
Serial.available() |
정수(수신된 바이트 수) | 수신 FIFO 버퍼에 읽지 않은 데이터가 몇 바이트 있는지 반환 |
Serial.read() |
1바이트 문자 (int/char) | 수신 버퍼의 선두에서 1글자를 꺼내어 읽음 (없으면 -1) |
Serial.write(val) |
원시 바이너리 바이트 | 1바이트의 이진 데이터를 그대로 전송 |
Serial.print(val) |
문자열, 숫자, 변수 | 사람이 읽기 편한 ASCII 문자열로 변환하여 출력 |
6. 시리얼 연동 시 반드시 기억해야 할 3대 안전 수칙

- GND 공통 접지(Common Ground) 연결 확인:
- 기준 전압(0V)이 같지 않으면 전압의 HIGH(5V)/LOW(0V)가 흔들려 외계어 같은 깨진 글자(모지바케)가 수신됩니다.
- 스케치 업로드 시 0번, 1번 선 분리:
- PC에서 USB로 코드를 업로드할 때 0번, 1번에 다른 아두이노가 꽂혀 있으면 업로드 충돌(
avrdude: stk500_recv(): programmer is not responding) 오류가 발생합니다. 업로드할 때는 선을 잠시 뽑아주세요!
- PC에서 USB로 코드를 업로드할 때 0번, 1번에 다른 아두이노가 꽂혀 있으면 업로드 충돌(
- 양쪽 보드의 보드레이트 일치:
- 마스터가 9600 bps로 쏘는데 슬레이브가 115200 bps로 듣고 있으면 전혀 대화가 통하지 않습니다.
🌟 도로시와 지니의 핵심 요약 노트!

- 👧 도로시: “하드웨어 시리얼은 TX와 RX를 X자로 엇갈려 꽂고, 두 보드의 GND를 반드시 하나로 묶어줘야 한다는 사실을 완벽히 이해했어!”
- 🐱 지니: “맞아! 보드레이트만 일치시키면 아두이노끼리 수십 킬로미터 떨어진 거리에서도 유선 케이블을 타고 완벽한 대화가 가능하단다.”
- 🐶 토토: “바우! 다음 시간에 2대의 아두이노로 버튼을 눌러 상대방 LED를 켜는 실전 코딩을 해보자 멍!”
서브목차