콘텐츠로 이동

Chapter 0. 시리얼 통신 개요

0절. 기본 용어

1절. 직렬(Serial) & 병렬(Parallel)

2절. RS-232

3절. RS-422

4절. RS-485

5절. 정리

6절. 주의사항

0절. 기본 용어

용어 영문 설명
보 레이트 Baud Rate - bit/sec 단위
- 초당 전송이 가능한 데이터 비트 수
데이터 비트 Data Bits - 통신의 단위 비트 길이
- 일반적으로 8 bits
=> 확장 아스키 코드 사용 목적
패리티 비트 Parity Bits - 패리티 오류 검출 비트
- 통신 무결성 체크
- 일반적으로 NONE 상태
- 오류 검출 시 수정 기능 X
스탑 비트 Stop Bits - 일반적으로 1로 설정
- 다음 시작 비트 전송을 위한 시간 할당 역할
흐름 제어 Flow Control 하드웨어 통신 무결성 보장
동기화 Synchronization 송신 측에서 보낸 데이터를 수신한 쪽에서도 같은 값으로 인식하기 위해 값을 맞추는 것
동기 통신 Synchronous Communication 수신자 & 송신자 간 상호 동기를 맞추고자 클럭 신호를 추가하는 통신
통신 프로토콜 Communication Protocol 서로 다른 기기들 간 데이터 교환을 원활하게 수행하기 위한 표준화 통신 규약

1절. 직렬(Serial) & 병렬(Parallel)

직렬(Serial) 통신

  • 한 비트씩 순차적인 전송 통신
  • 데이터 일렬 전송 가능
  • 느린 전송 속도
  • 먼 거리로 전송 가능
  • 단순하며 I/O 라인 절약 가능
    • 비용 절감

직렬(Serial) 통신 장점

  • 비교적 적은 전선으로 데이터를 안정적으로 전송

1. 배선이 단순하고 저렴

2. 장거리 데이터 전송 가능

3. 높은 노이즈 저항성

4. 무선 통신 적용 가능

병렬(Parallel) 통신

  • 별도 연결의 동시 전송 통신
  • 한 번에 여러 데이터 전송 가능(여러 개의 선로)
  • 직렬 통신보다 빠른 속도
  • 필수적인 동기화
  • 짧은 통신 거리
  • 다수의 I/O 라인 소모

병렬 통신의 한계

1. 하드웨어 복잡성 증가

  • 여러 개의 데이터 라인 필요
  • 선이 많아지고 회로 복잡성 증가

2. 신호 간섭 문제

  • 데이터 라인 증가
  • 신호 간섭(CrossTalk) 발생 가능성 상승

3. 장거리 전송 부적합

  • 거리가 길어질수록 신호 약화
  • 타이밍 차이(skew) 발생
  • 동기화가 어려움

직렬 VS 병렬

특징 직렬(Serial) 병렬(Parallel)
전송 속도 느림 상대적으로 빠름
통신 선로 개수 1 개 여러 개
클럭 당 전송 비트 수 1 bits 통신 선로 개수 만큼
비용 적음 높음
채널 간 간섭 X 존재
시스템 업그레이드 쉬움 어려움
전송 모드 전이중
Full-Duplex
반이중
Half-Duplex
전송 거리 먼 거리 짧은 거리
고 주파수 동작 상대적으로 효과적 덜 효과적

2절. RS-232C

RS-232C

  • 표준 인터페이스
  • 미국 EIA(전자산업협회, Electronic Industries Alliance)에서 제정
  • 직렬 이진 데이터의 교환을 하는 데이터 단말 장치(DTE)와 데이터 통신 장치(DCE) 간 인터페이스 규격
  • 1:1 통신
  • 전기적 신호 레벨
  • 일반적으로 +3V ~ +15V는 논리 0(OFF)
  • -3V ~ -15V는 논리 1(ON)
  • TTL 통신(0~5V)에 비해 ±10V 정도의 큰 전압 스윙을 사용
  • 노이즈에 강함
  • 통신 거리
  • 15m
  • 빠른 속도
  • 짧은 거리
  • 느린 속도
  • 먼 거리
  • 좋은 선로 품질
  • 더 좋은 먼 거리 통신
  • 신호선
  • 서로 주고 받는 통신
신호선 구성
송신(TX)
수신(RX)
공통접지(GND)

RS-232C 용어 분해

  • Recommended Standard
  • 권장 표준
  • 232
  • 규격 식별 번호
  • C
  • 버전

RS-232C 통신

  • 해당 통신을 위한 3개의 선
  • TXD(송신)
  • RXD(수신)
  • GND(접지)

PIN # 방향 명칭 영문 설명
1 Input CD Carrier Detect 해당 핀이 논리 0이 되면 해당 장치가 보낸 데이터를 상대 장치가 수신했음을 인지
2 Input RxD Received Data 데이터 수신 핀
3 Output TxD Transmitted Data - 데이터 전송 핀
- 이 장치가 대기 상태인 경우 논리 1 출력
4 Output DTR Data Terminal Ready 해당 핀이 논리 0을 출력하면 상대 장치에게 데이터 송신 준비가 됐음을 알림
5 . GND Signal Ground 접지
6 Input DSR Data Set Ready 해당 핀이 논리 0이 되면 상대 장치가 데이터를 송신할 준비가 됐음을 인지
7 Output RTS Request TO Send 해당 핀에 논리 0을 출력하면 상대방 장치에게 데이터를 수신할 준비가 됐음을 알림
8 Input CTS Clear TO Send 해당 핀이 논리 0이 되면 상대 장치가 데이터를 수신할 준비가 됨을 인지
9 Input RI Ring Indicator 해당 핀이 논리 0이 되면 모뎀에 통신 연결 요구의 발생을 인지

3절. RS-422

RS-422

  • 차동 신호 이용 통신
  • 각 신호 종류 당 2개의 신호선을 쓰는 것이 중요
  • 차동 신호 : 두 신호 간 차를 이용한 것으로 노이즈에 강함
  • ex) 전선 2가닥을 꼬아서 각각 10V, 5V를 준 상태
    • 노이즈가 3V라면?
    • 13 - 7 = 5V
    • 즉, 차잇값이 5V로 동일
    • 노이즈에 영향이 적거나 없음

4절. RS-485

RS-485

  • 반 이중 통신 방식
  • 송신 및 수신 동시에 불가능
  • 2선 결선 방식에 해당
  • RS-422의 제한된 디바이스 개수를 확장하고 입력과 출력의 전압 부분이 강화된 통신 방식
  • N : N 통신 가능

5절. 정리

통신 규격 사양

Specification RS-232C RS-422 RS-485
동작 모드 Single-Ended Differential Differential
최대 Driver 수 1 Driver 1 Driver 32 Drivers
최대 Receiver 수 1 Receiver 10 Receivers 32 Receivers
최대 통달 거리 약 15 m 약 1.2 km 약 1.2 km
최고 통신 속도 20 kb/s 10 Mb/s 10 Mb/s
지원 전송 방식 Full Duplex Full Duplex Half Duplex, Full Duplex
최대 출력 전압 ±25 V 2 V ~ 6 V 1.5 V 이상
최대 입력 전압 ±15 V -7 V ~ +7 V -7 V ~ +12 V

6절. 주의사항

제어 문자(STX/ETX) 처리

  • 데이터 변질 문제
  • 문자열 인코딩(UTF-8, ASCII 등) 과정에서 특정 바이트 값(특히 0x80 이상)이 '알 수 없는 문자'로 변환될 가능성 존재
    • string
    • char
해결 방안

byte vs char 타입 혼용 금지

제어 문자는 반드시 byte 배열로 처리해야 함. (예: byte[] packet = { 0x02, ... };)

ASCII 인코딩 사용 시 7비트 범위를 벗어나는 데이터가 손실될 위험이 있음.

2. 데이터 파편화(Fragmentation) 및 뭉침(粘包) 현상 (가장 중요)

​ 문제점: SerialPort.Read() 이벤트가 발생했을 때, 내가 보낸 패킷(STX ~ ETX)이 한 번에 전부 들어온다는 보장이 없음.

경우 1: STX와 데이터 일부만 먼저 들어오고, 나머지는 다음 이벤트에 들어옴 (파편화).

경우 2: 앞 패킷의 끝부분과 뒤 패킷의 앞부분이 합쳐져서 들어옴 (뭉침).

해결책: 수신 버퍼(Buffer)를 만들어서 데이터를 누적시킨 뒤, STX와 ETX를 찾아 완벽한 하나의 패킷이 되었을 때만 처리(Parsing)해야 함.

  1. 엔디안(Endianness) 불일치 주의 문제점: PC(C# WinForm)는 리틀 엔디안(Little Endian)을 쓰지만, 일부 PLC나 임베디드 장비(Big Endian)는 바이트 순서가 반대일 수 있음.

해결책: 2바이트 이상의 숫자(int, short 등)를 보낼 때는 상호 간의 엔디안 방식을 확인하고, 필요시 Array.Reverse() 등으로 순서를 맞춰야 함.

  1. 스레드(Thread) 충돌 및 UI 블로킹 ​ 문제점: DataReceived 이벤트는 별도의 스레드에서 발생함. 여기서 수신된 데이터를 텍스트박스 등에 바로 출력하려고 하면 크로스 스레드(Cross-thread) 예외 발생.

해결책: Invoke 또는 BeginInvoke를 사용하여 UI 스레드에서 화면을 갱신해야 함.