시리얼 통신 (Serial Port)
Serial Port
시리얼 통신 (Serial Port)
시리얼 통신은 산업 현장, 제조 장비, 센서 장치 등에서 널리 사용되는 통신 방식 입니다.
C#에서는System.IO.Ports.SerialPort
클래스를 통해 쉽게 구현할 수 있으며,
이번 글에서는 RS232 / RS485 통신 방식의 차이점과 함께, C# 에서 시리얼 통신을 구현하는 방법을 소개합니다.
RS232 vs RS485 란 ?
항목 | RS232 | RS485 |
---|---|---|
통신 방식 | 포인트-투-포인트 (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 라이센스를 따릅니다.