C# CSharp 에서 시리얼 통신 SerialPort 의 RX TX 통신 방법 - Whitmem
C# CSharp 에서 시리얼 통신 SerialPort 의 RX TX 통신 방법
회로 및 하드웨어 개발
2025-06-23 21:41 게시 1ccaeac9abdff3c3b86a

0
0
17
이 페이지는 외부 공간에 무단 복제할 수 없으며 오직 있는 그대로 게시되며 부정확한 내용을 포함할 수 있습니다. 법률이 허용하는 한 가이드 라인에 맞춰 게시 내용을 인용하거나 출처로 표기할 수 있습니다.
This page is not to be distributed to external services; it is provided as is and may contain inaccuracies.
보통 시리얼 포트는 기기 또는 장비와 간단하게 송수신 통신을 할 때 사용된다. 무거운 통신은 아니고 조작, 요청, 제어 등의 통신에서 사용되는데 시리얼 통신은 RX, TX 형태로 송수신이 가능하다는 특이점이 존재한다.
우선 필자의 경우 적당한 시리얼 통신 가능한 기기가 없기 때문에, Arduino 기기를 사용해서 임의 시리얼 통신 가능한 디바이스를 구축하였다. Arduino 는 기본적으로 USB 통신에 시리얼 포트 RX, TX 를 사용하기 때문에 자체 Serial 라이브러리가 탑재되어 있어 사용하기 어렵지 않다.
void setup() { // put your setup code here, to run once: Serial.begin(9600); } void loop() { // put your main code here, to run repeatedly: String data = Serial.readStringUntil('\n'); Serial.println(data.c_str()); }
위 코드는 Arduino 기기 안에서 실행되는 코드로, 9600 baudrate 로 Serial 포트를 개방하고 통신하기 위해 작성한 코드이다. 특히 loop 는 내부적으로 반복되는 함수 영역인데, 이 영역에서 시리얼 통신의 버퍼를 읽어들여 \n 라는 char 가 나올 때 까지 쌓아뒀다가 모이면 블럭킹이 해제되어 data에 담는다. 그리고 data에 담긴 String 을 c_str() 을 통해 char * 형태로 변환한 뒤 Serial 의 TX 를 통해 상대 기기에 전송한다.
즉 장비 입장에서 RX를 통해 Serial 의 어떤 입력 요청을 라인 단위로 받은 뒤, 해당 입력을 다시 장비에 연결된 TX 로 전송한다.
Baudrate 는 통신 속도를 의미하는 것으로, Serial 통신은 기본적으로 어떤 클럭 정보를 같이 송수신하지 않고 타이밍에 맞춰 같은 속도로 읽기를 시도한다. 이는 동기화되는 시점이 미묘하게 달라도 결과적으로 한 비트 영역 안에서 시간 오차가 발생하기 때문에 읽어들이는 건 동일하다.
빨간 선이 컴퓨터나 상대 장비에서 일정한 주기 속도로 읽기를 요청하는 타이밍이고, 실제 통신 되는 클럭은 보내는 쪽에서 같은 주기 속도로 쓰기를 요청한다. 즉 빨간색 영역은 읽는 시점에 따라 조금씩 빗겨나갈 수 있지만, 속도가 동일하면 빨간 라인, 즉 초 간격은 동일하며 어긋난 지점이라도 읽어지는 데이터 비트는 동일하다.
이 상황에서 PC 소프트웨어로 와서,
SerialPort 를 참조하려고 하면 그런 이름이 컨텍스트에 없다고 오류가 뜨는데, 마우스를 가져다 대고 패키지 설치 및 using 해주면 된다.
SerialPort sp = new SerialPort(); sp.BaudRate = 9600; sp.PortName = "COM3"; sp.Open();
SerialPort 라는 클래스를 생성한 뒤 BaudRate 로 속도를 지정, PortName 에 포트 네임을 지정해주면 된다.
그리고 데이터를 수신했을 때 이벤트인 DataReceived 를 이벤트 핸들러 형태로 메서드를 추가해주면 된다.
즉 DataReceived 에서는 RX 에서 데이터가 발생한 경우, SerialPort 클래스 인스턴스를 통해 ReadLine 할 수 있다. SerialPort 인스턴스를 처음에는 Main 내부 지역 변수로 사용했기 때문에 호출할 수 없었는데, 이를 전역 변수로 정의 하고, DataReceived 시에 SP 전역 변수로부터 readLine 하여 실제 데이터를 읽을 수 있다. 이를 콘솔 창에 출력 해 본다.
그리고 시리얼 포트에 연결되면 임의로 메시지를 기기 쪽에 전송해본다. 이는 TX 채널을 통해 전송될 것이다.
이 SerialPort 는 비동기 방식으로 소프트웨어에서 실행된다. 따라서 이벤트를 등록하였음에도 Main 의 끝점에 도달하면 소프트웨어가 종료된다. 프로그램이 초반에 바로 꺼지는 것을 방지하기 위해서 while 무한 루프를 통해 대기 모드로 들어갈 수 있도록 하였다.
SerialPort 의 TX로 전송한 메시지가 결과적으로 다시 RX 채널인 DataReceived 로 수신하여 Console.WriteLine 을 통해 출력되는 것을 확인할 수 있다.
참고로, baudrate 는 초당 비트수이기 때문에, 9600 에서는 초당 9600 비트의 데이터를 송수신할 수 있는 것이다. 1200(1KB) 바이트 정도를 초당 주고 받을 수 있다고 생각하면 된다.
댓글 0개
댓글을 작성하는 경우 댓글 처리 방침에 동의하는 것으로 간주됩니다. 댓글을 작성하면 일회용 인증키가 발급되며, 해당 키를 분실하는 경우 댓글을 제거할 수 없습니다. 댓글을 작성하면 사용자 IP가 영구적으로 기록 및 부분 공개됩니다.
확인
Whitmemit 개인 일지 블로그는 개인이 운영하는 정보 공유 공간으로 사용자의 민감한 개인 정보를 직접 요구하거나 요청하지 않습니다. 기본적인 사이트 방문시 처리되는 처리 정보에 대해서는 '사이트 처리 방침'을 참고하십시오. 추가적인 기능의 제공을 위하여 쿠키 정보를 사용하고 있습니다. Whitmemit 에서 처리하는 정보는 식별 용도로 사용되며 기타 글꼴 및 폰트 라이브러리에서 쿠키 정보를 사용할 수 있습니다.
이 자료는 모두 필수 자료로 간주되며, 사이트 이용을 하거나, 탐색하는 경우 동의로 간주합니다.