← 로봇 통신 강의 목록으로
🤖
통신 기초
통신 기초 · 선수: 03강

04. RS-232 직렬 통신

RS-232는 로봇과 호스트(PC·PLC)를 케이블 한 가닥으로 1:1 연결하는 가장 오래된 직렬 통신입니다. 03편의 CWRITE/CREAD와 { }·, 패킷 포맷이 시리얼에서도 그대로 쓰이고, 바뀌는 것은 물리 계층과 COPEN 첫 인자(ETH→SER)뿐임을 확인합니다. 패킷 프레이밍은 포트 없이 순수 Python으로 검증하고, 실제 시리얼 송수신은 com0com 가상 COM 포트로 실습합니다.

RS-232시리얼COPEN(SER)baud ratecom0com교차배선
소요 시간
약 1~1.5시간
난이도
📊 초급
선수 조건
🎯 03강
결과물
RS-232의 1:1 점대점·TX↔RX 교차·동일 baud 특성을 이해하고, TCP/IP와 동일한 패킷 포맷으로 encode/decode 하며 com0com으로 실제 시리얼 송수신을 재현할 수 있습니다.

이 강의에서 배우는 것

  • 1RS-232의 물리 특성(1:1 점대점, TX↔RX 교차+공통 GND, 양측 동일 baud)을 설명한다
  • 2COPEN(SER) 첫 인자가 시리얼임을 알고 TCP/IP의 ETH와 구분한다
  • 3{ }·, 패킷의 encode/decode 와 non-format(ASCII decimal)을 비교한다
  • 4com0com 가상 COM 쌍(COM5↔COM6)으로 pyserial 에코를 동작시킨다

소개

이더넷처럼 여러 노드가 한 선을 공유하지 않고, 두 장치만 한 케이블로 직접 연결합니다. 명령 흐름과 패킷 포맷은 03편 TCP/IP와 똑같고, 딱 하나 COPEN 의 첫 인자만 ETH→SER로 바뀝니다.

핵심 개념

1) 1:1 점대점 + TX↔RX 교차

text
   로봇 컨트롤러            호스트(PC/PLC)
     TX  ─────────────────►  RX
     RX  ◄─────────────────  TX     ← 교차(cross)
     GND ─────────────────  GND     ← 공통 접지
⚠️

baud rate(통신 속도)는 양측이 반드시 동일해야 합니다. 이더넷처럼 자동 협상이 없어, 한쪽만 9600·다른 쪽이 19200이면 글자가 깨집니다 — 수동으로 맞춰야 합니다.

2) TCP/IP vs RS-232

구분TCP/IPRS-232
COPEN 첫 인자ETHSER
연결 방식다대다·네트워크1:1 점대점
배선 핵심허브/스위치TX↔RX 교차+공통 GND
속도 협상자동수동(양측 baud 동일)
패킷 포맷{ }·,·non-format동일

핵심: 명령어와 패킷 포맷은 같고, 물리 계층과 COPEN 첫 인자만 다릅니다. non-format 모드는 시작/끝·구분 기호 없이 ASCII CODE(10진수)로 1바이트씩 해석합니다("AB"→[65,66]).

핵심 예제

RS-232 패킷 포맷의 encode/decode 를 순수 Python으로 구현해 왕복(round-trip) 검증합니다(포트 불필요).

python
def encode_packet(values):
    return "{" + ",".join(str(v) for v in values) + "}"   # [123,456] -> "{123,456}"
def decode_packet(packet):
    return [int(t) for t in packet.strip().strip("{}").split(",")]
encode_nonformat = lambda text: [ord(ch) for ch in text]    # "AB" -> [65, 66]
bash
# com0com 가상 COM 쌍(COM5↔COM6) 생성 후 (선택)
python ../../_shared/serial_echo.py  --port COM6 --baud 9600   # 터미널 A 에코
python ../../_shared/serial_client.py --port COM5 --baud 9600 --value 123  # 터미널 B
# 양쪽 --baud 가 같아야 함. 한쪽만 19200이면 응답이 깨지거나 b'' 가 온다
ℹ️

실장비 대응: serial.Serial('COM5',9600)↔COPEN(SER), ser.write↔CWRITE, ser.read↔CREAD, ser.close↔CCLOSE. com0com은 한쪽에 쓰면 다른 쪽에서 읽히는 가상 포트 쌍으로 크로스 케이블을 소프트웨어로 대신합니다.

자주 하는 실수

Q. 응답이 b''(빈 값)로 옵니다 / 글자가 깨집니다.

A. 에코 서버 미실행 또는 baud 불일치입니다. 에코 서버를 먼저 띄우고 양쪽 --baud 를 동일(9600)하게, 기본 8N1을 유지하세요. RS-232는 자동 협상이 없어 수동으로 맞춥니다.

Q. SerialException: could not open port 'COM6'.

A. com0com 쌍 미생성·포트 오타·다른 프로그램의 선점입니다. 장치 관리자에서 COM5/COM6을 확인하고 다른 시리얼 프로그램을 종료하세요.

Q. HRSS 통신 화면에 아무것도 안 보입니다.

A. RS-232 설정의 "Show message" 가 미체크된 경우입니다(기본값 미표시). 체크 후 테스트하세요.

정리

  • RS-232는 1:1 점대점이며 배선 핵심은 TX↔RX 교차+공통 GND, 양측 baud 동일
  • 명령 흐름(COPEN→CWRITE→CREAD)과 패킷 포맷({ }·,·non-format)은 TCP/IP와 동일
  • 바뀌는 것은 물리 계층과 COPEN 첫 인자(ETH→SER)뿐
  • com0com 가상 COM으로 실제 시리얼 송수신까지 PC에서 재현한다

과제

  1. [123,456] 와 [90000,-45100,30] 을 encode/decode 왕복 검증
  2. 한쪽 baud 만 19200으로 바꿔 응답이 깨지는 것을 재현하고 원인 설명
  3. non-format 으로 "AB" 를 [65,66] 로 변환·복원하기
예제 코드 / 강의 자료

전체 강의 자료와 예제 코드(시뮬레이터·과제·정답 포함)는 GitHub에서 자유롭게 받아볼 수 있습니다.

GitHub에서 보기 ↗