포스트

시리얼 통신 (Serial Port)

Serial Port

시리얼 통신 (Serial Port)

시리얼 통신은 산업 현장, 제조 장비, 센서 장치 등에서 널리 사용되는 통신 방식 입니다.
C#에서는 System.IO.Ports.SerialPort 클래스를 통해 쉽게 구현할 수 있으며,
이번 글에서는 RS232 / RS485 통신 방식의 차이점과 함께, C# 에서 시리얼 통신을 구현하는 방법을 소개합니다.

RS232 vs RS485 란 ?

항목RS232RS485
통신 방식포인트-투-포인트 (1:1)멀티 드롭 (1:N)
배선 수3선 (TX, RX, GND)2선 (A, B) or 3선 (A, B, GND)
통신 거리약 15m 이내최대 1200m
속도낮음상대적으로 높음
신호 방식전압 기반차동 신호 (노이즈에 강함)
주요 사용처PC ↔ 장치PLC ↔ 여러 장치, 산업용 제어

⚠️ RS485는 반이중(half duplex) 방식이 일반적이기 때문에 송/수신 전환 제어(RTS 등)가 필요할 수 있습니다.

C#에서 Serial Port 로 시리얼 통신하기

1
2
3
4
5
6
7
using System.IO.Ports;

SerialPort port = new SerialPort("COM3", 9600, Parity.None, 8, StopBits.One);
port.Open();
port.WriteLine("Hello Device!");
string response = port.ReadLine();
port.Close();
  • COM3: Windows에서 인식된 포트 이름
  • 9600: 전송 속도 (Baudrate)
  • 8: 데이터 비트 수
  • None: 패리티 비트 없음
  • StopBits.One: 스탑 비트 1개

비동기 수신 (이벤트 기반)

1
2
3
4
5
6
port.DataReceived += (s, e) =>
{
    string data = port.ReadExisting();
    Console.WriteLine("수신: " + data);
};
port.Open();

이벤트는 백그라운드 스레드에서 발생하므로 UI를 직접 수정하려면 Invoke 필요

예외 처리

1
2
3
4
5
6
7
8
9
10
11
12
try
{
    port.Open();
}
catch (UnauthorizedAccessException)
{
    Console.WriteLine("포트 접근 권한 없음");
}
catch (IOException)
{
    Console.WriteLine("포트 연결 실패 또는 사용 중");
}

자주 발생하는 문제

증상원인
포트가 안 열림이미 다른 프로그램(예: 아두이노 IDE)이 사용 중)
수신이 끊김케이블 접촉 불량 또는 GND 미연결
한글 깨짐인코딩 설정 필요 → port.Encoding = Encoding.UTF8
데이터가 잘림장치가 패킷 단위로 보내지 않음 → 수신 버퍼 파싱필요

RS485로 통신할 때 주의할 점

  • 송수신 제어가 필요한 경우 RTS 신호 사용 가능
    일부 컨버터는 port.RtsEnable = true/false 로 송수신 전환을 해야 함
  • 노이즈에 강하지만, GND 연결 안 하면 동작 불안정할 수 있음
  • 여러 장치와 통신할 땐 각 장치의 주소 기반 프로토콜 구현 필요

마무리

  • RS232는 간단한 1:1 통신에 적합하고
  • RS485는 산업용 환경에서 다수의 장치를 통신선 하나로 연결할 때 유리합니다.
  • C#의 SerialPort 클래스를 사용하면 비교적 쉽게 시리얼 통신을 구현할 수 있지만, 실무에서 패킷 처리, 타임아웃, 라인 파싱, CRC 검증 등이 함께 필요합니다.
이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.