[C#] #1 - Serial Communication 기초

Programming/C# · 2020. 7. 2. 13:43

출처: http://www.csharpstudy.com/Practical/Prac-serialport-adv.aspx

 

 

1. 기초

 

시리얼 포트는 한 번에 하나의 비트 단위로 정보를 주고 받을 수 있는 직렬 통신의 물리적 인터페이스이다.

 

시리얼 포트는 일반적으로 RS-232 표준을 따르는 하드웨어이고, 내가 사용하고자 하는 하드웨어느 RS-422이다.

-> 통신 속도와 전송 거리 등에 차이점이 있다.

 

.NET(winfrom application)에서 시리얼포트를 사용하기 위해선 System.IO.Ports 네임스페이스 안의 SerialPort 클래스를 이용해야 한다.

 

SerialPort 클래스를 사용하는 절차는 다음과 같은 5단계로 나눌 수 있다.

 

1) SerialPort 클래스 객체 생성

2) (Optional) SerialPort 포트 셋팅

3) 시리얼포트 오픈

4) 시리얼포트에서 데이타 읽거나 쓰기

5) 시리얼포트 닫기

 

아래 예제처럼 SerialPort 객체를 파라미터 설정 없이 생성하면 디폴트 COM 포트 셋팅을 사용한다.

-> COM1 포트, 9600 BaudRate, 8 DataBits, None Parity, 1 StopBits

 

2. 시리얼 포트에서 데이터 읽기

 

시리얼 포트에서 데이터를 읽어오는 코드는 위의 기본 절차들을 따르면 된다.

 

가장 간단한 동기식 시리얼 통신의 예제를 살펴본다.

 

예제는 COM5 포트를 열고, 한 라인의 데이터를 읽어 오는 코드이다.

시리얼포트에서 읽은 한 라인을 출력하고 COM5 포트를 닫게 된다.

 

 

시리얼 포트에서 데이터를 읽는 방법은 여러 가지가 있다.

 

1) 한 바이트만 읽어오는: ReadByte()

2) 한 글자를 읽어오는: ReadChar()

3) 여러 바이트를 읽어오는 Read()

4) 한 라인을 읽어오는 ReadLine()

 

 

3. 시리얼 포트에 데이터 쓰기

 

시리얼 포트에 데이터를 쓰는  코드는 위의 데이터를 읽는 코드와 거의 비슷하다.

 

차이점은 읽기 대신 쓰기 방법(Method)를 사용한다는 점이다.

 

가장 간단한 예제로 시리얼 포트를 열고 동기적으로 데이터를 쓰는 코드를 살펴본다.

 

예제는 COM6 포트를 열고, 한 라인의 데이터를 쓰고 COM 포트를 닫는 코드이다.

 

 

시리얼 포트에서 데이터를 쓰는 방법은 아래 두가지 방법 등이 있다.

 

1) 문자열을 Newline 없이 쓰는 Write() 

2) 한 라인을 쓰는 WriteLine()

 

 

4. 시리얼 포트 셋팅 옵션

 

SerialPort 객체를 생성할 때, 혹은 객체를 생성하고 포트를 오픈하기 전에 해당 포트를 설정할 수 있다.

 

자주 사용하는 포트 설정 옵션은 포트명(PortName), BaudRate, DataBits, Parity, StopBits 등이 있다.

 

이 중에서 BaudRate, DataBits, Parity, StopBits 등의 설정은 시리얼 통신을 하는 양쪽 포트에서 동일하게 설정해야 한다.

 

아래 예제는 SerialPort 객체를 생성한 후, 여러 포트 셋팅옵션들을 지정하는 코드이다.

많은 경우 Default 설정 옵션을 많이 사용하므로 아래의 옵션들은 필요할 때 설정하면 된다.

 

 

 

** 시리얼 포트 비동기 처리

 

시리얼 포트 통신을 통해 데이터를 처리하기 위해서는 동기적인 방식보다 비동기적인 방식이 효율적인 경우가 많다.

 

즉, 시리얼 포트 읽기나 쓰기를 별도의 작업쓰레드에서 실행하게 하여 메인쓰레드가 주변기기 통신에 묶여있지 않도록 한다.

 

DataReceived 이벤트 핸들러는 시리얼 포트에서 비동기적 데이터를 읽기 위해 간단하게 사용하는 방법 중 하나이다.

 

해당 이벤트 핸들러는 데이터가 시리얼 포트에 도착했을 때 DataReceived 이벤트 핸들러에 지정된 코드가 실행된게 한다.

 

아래 예제는 DataReceived 이벤트 핸들러를 사용하여 COM5 포트로부터 데이터가 도착하면 콘솔에 출력해 주는 간단한 코드이다.

 

 

 

 

시리얼 포트 통신에서 이벤트 핸들러를 사용하지 않고 직접 작업 쓰레드를 생성해서 처리할 수도 있다.

 

아래 예제는 간단한 콘솔 채팅 프로그램이다.

프로그램 한편에선 시리얼 포트 읽기를 위한 작업 쓰레드를 생성하여 계속 루프를 돌며 읽기 작업을 처리하고,

다른 한편으로 메인 쓰레드에서 시리얼 포트에 데이터를 쓰는 작업을 할 수 있도록 한다.

(해당 예제는 MSDN에서 제공하는 코드를 간결하게 Refactoring하고, 약간의 버그를 수정한 것이다.)

 

 

 

 

 

 

 

 

 

 

반응형

'Programming > C#' 카테고리의 다른 글

C# Network - Socket, TCP, UDP  (0) 2020.09.16