C 시리얼 통신 클래스 - C silieol tongsin keullaeseu

최근 회사에서 GPS 수신을 위해 Serial 통신 관련 개발을 잠깐 하게되어 포스팅 합니다.

Show

    어짜피 GPS가 아니더라도 Serial 통신이란게 어짜피 Com Port 를 통해 Read Write 하는 구조는 같고, 이외에도 써먹을만한데는 많을 것 같아 적어두면 좋겠다 했죠 :)

    Serial 통신은 Port의 Open과 Close, 그리고 Read, Write 의 네가지로 모든 것이 이루어집니다. 좀더 깊게 들어간다면 BaudRate, StopBit, Parity 등 알아야 할 것이 많지만, 저는 기본적으로 사용 방법정도만 설명할 생각입니다.

    이쪽 전문가가 아니기 때문도 있구요.

    아래는 통신을 간단하게 사용하기 위한 클래스입니다.

    - SerialPort.h

    - SerialPort.cpp

    생각보다 별거 없습니다. 파일 읽고 쓰는거랑 별반 차이 없고, 단지 실시간으로 Read/Write 하려면 Timer 혹은 Thread 를 통해 작업해주면 되겠습니다.

    사용법은 아래와 같이 간단해요~

    워낙 시리얼 통신에 대한 글이 많지만 여러모로 찾아다니는것도 골치고, 언제 또 사용할 지도 모르는 일이니 가볍게 포스팅 해봅니다.

    시리얼 포트 (Serial Port, 직렬 포트)는 한 번에 하나의 비트 단위로 정보를 주고 받을 수 있는 직렬 통신의 물리적 인터페이스로서 다양한 주변 기기와의 통신에 사용한다. 시리얼 포트는 일반적으로 RS-232 표준을 따르는 하드웨어로서 모뎀이나 직렬 마우스, 바코드 리더, 디지탈 측정 장비 등 다양한 주변 기기를 시리얼 포트에 연결하여 사용할 수 있다.

    .NET 에서 시리얼포트를 사용하기 위해서는 System.IO.Ports 네임스페이스 안의 SerialPort 클래스를 이용하면 된다. SerialPort 클래스를 사용하는 절차는 크게 다음과 같이 5단계로 나눌 수 있다.
    (주: 아래의 1~2단계는 SerialPort 객체를 생성하면서 동시에 포트 셋팅을 지정할 수도 있기 때문에 하나로 볼 수도 있다.)

    1) SerialPort 클래스 객체 생성
    2) (Optional) SerialPort 포트 셋팅
    3) 시리얼포트 오픈
    4) 시리얼포트에서 데이타 읽거나 쓰기
    5) 시리얼포트 닫기

    아래 예제처럼 SerialPort 객체를 아무 파라미터 없이 생성하면 디폴트 COM 포트 셋팅을 사용한다. (디폴트 포트 셋팅은 COM1 포트, 9600 BaudRate, 8 DataBits, None Parity, 1 StopBits 를 사용한다)

    예제

    // 1. SerialPort 클래스 객체 생성 (디폴트로 포트 셋팅 사용)
    SerialPort sp = new SerialPort();
    
    // 2. 시리얼포트 오픈
    sp.Open();
    
    // 3. 시리얼포트에서 한 라인 읽기
    string data = sp.ReadLine();
    
    // 4. 시리얼포트 닫기
    sp.Close();
    
    




    시리얼 포트에서 데이타를 읽어오는 코드는 위의 기본 절차들을 따르면 된다. 일반적으로 실무에서 시리얼포트 통신을 위해서는 비동기 방식을 사용하지만, 여기서는 가장 간단한 예제를 들기 위해 시리얼 포트를 열고 동기적으로 데이타를 읽어 오는 코드를 살펴본다. 아래 예제는 COM5 포트를 열고, 한 라인의 데이타를 읽어 오는 코드이다. 이어 코드는 시리얼포트에서 읽은 한 라인을 출력하고 COM5 포트를 닫게 된다.

    시리얼포트에서 데이타를 읽는 메서드는 여러 가지가 있다. 즉, 한 바이트만 읽어오는 ReadByte(), 한 글자를 읽어오는 ReadChar(), 여러 바이트들을 읽어오는 Read(), 한 라인을 읽어오는 ReadLine() 등이 있다.

    예제

    using System;
    using System.IO.Ports;
    
    namespace SerialApp
    {
        class Program
        {
            static void Main(string[] args)
            {
                // 1. SerialPort 클래스 객체 생성  (COM5 포트를 사용)
                SerialPort sp = new SerialPort("COM5");
    
                // 2. 시리얼포트 오픈
                sp.Open();
    
                // 3. 시리얼포트에서 한 라인 읽기
                string data = sp.ReadLine();
    
                Console.WriteLine(data);
    
                // 4. 시리얼포트 닫기
                sp.Close();
    
                Console.WriteLine("Press Enter to Quit");
                Console.ReadLine();
            }
        }
    }
    
    




    시리얼 포트에 데이타를 쓰는 코드는 위의 데이타를 읽는 코드와 거의 유사한데, 차이점은 읽기 메서드 대신 쓰기 메서드를 사용한다는 점이다. 여기서는 가장 간단한 예제로 시리얼 포트를 열고 동기적으로 데이타를 쓰는 코드를 살펴본다. 아래 예제는 COM6 포트를 열고, 한 라인의 데이타를 쓰고 COM 포트를 닫는 코드이다.

    시리얼포트에서 데이타를 쓰는 메서드는 문자열을 Newline 없이 쓰는 Write() 메서드와 한 라인을 쓰는 WriteLine() 등이 있다.

    예제

    using System.IO.Ports;
    
    namespace SerialWrt
    {
        class Program
        {
            static void Main(string[] args)
            {
                // 1. SerialPort 클래스 객체 생성  (COM6 포트를 사용)
                SerialPort sp = new SerialPort("COM6");
    
                // 2. 시리얼포트 오픈
                sp.Open();
    
                // 3. 시리얼포트에서 한 라인 쓰기
                sp.WriteLine("Hello World");
    
                // 4. 시리얼포트 닫기
                sp.Close();
            }
        }
    }
    
    




    SerialPort 객체를 생성할 때, 혹은 객체를 생성하고 포트를 오픈하기 전에 해당 포트에 대한 셋팅을 설정할 수 있다. 자주 사용하는 포트 셋팅 옵션으로는 포트명(PortName), BaudRate, 데이타비트(DataBits), 패러티(Parity), 스톱비트(StopBits) 등이 있는데, BaudRate,DateBits,Parity,StopBits 등의 셋팅들은 시리얼 통신을 하는 양쪽 포트에서 동일하게 설정해야 한다.

    아래 예제는 SerialPort 객체를 생성한 후, 여러 포트 셋팅 옵션들을 지정하는 예이다. 많은 경우 디폴트 포트 셋팅 옵션을 많이 사용하므로 이러한 옵션들은 필요할 때만 설정하면 된다.

    예제

    // 1. SerialPort 클래스 객체 생성
    SerialPort sp = new SerialPort();
    
    // 2. SerialPort 포트 셋팅 설정
    sp.PortName = "COM6";
    sp.BaudRate = 9600;
    sp.DataBits = 8;
    sp.Parity = Parity.None;
    sp.StopBits = StopBits.One;
    
    // 3. 시리얼포트 오픈
    sp.Open();
    
    




    본 웹사이트는 광고를 포함하고 있습니다. 광고 클릭에서 발생하는 수익금은 모두 웹사이트 서버의 유지 및 관리, 그리고 기술 콘텐츠 향상을 위해 쓰여집니다.



    아두이노는 UART 시리얼 통신을 통해 컴퓨터와 데이터를 주고 받는다.

    이번에는 C++을 사용하여 아두이노와 시리얼 통신을 하여 데이터를 주고 받아보자

    아두이노 공식 포럼에서는 C++를 사용한 시리얼 통신 라이브러리를 제공하고 있다.

    https://playground.arduino.cc/Interfacing/CPPWindows/

    Arduino Playground - CPPWindows

    Interfacing... Arduino and C++ (for Windows) As I found it pretty hard finding the good information, or an already working code to handle Serial communication on windows based system, I finally made a class that do what is needed for basic Serial Communica

    playground.arduino.cc

    위 라이브러리 코드를 자신이 사용할 프로젝트 파일에 추가하여 사용하면 된다.

    C 시리얼 통신 클래스 - C silieol tongsin keullaeseu

    위 처럼 소스 파일에 헤더파일과 cpp 파일을 추가하여 포럼에 안내된 코드를 추가하면 된다.

    코드를 추가하고 Serial.cpp 의 CreateFile 에 오류가 생긴다면 CreateFileA로 수정하자

    C 시리얼 통신 클래스 - C silieol tongsin keullaeseu

    이후 예제 코드를 입력한 후 자신의 아두이노 포트를 알맞게 수정하고 실행하면 기본적인 데이터를 받는 코드는 완성된다.

    C 시리얼 통신 클래스 - C silieol tongsin keullaeseu
    C 시리얼 통신 클래스 - C silieol tongsin keullaeseu

    장치관리자를 들어가면 현재 연결된 아두이노가 어느 포트로 등록되어 있는지를 확인할 수 있다.

    예제 코드를 아두이노 포트를 수정하여 실행하면 아두이노와 통신할 수 있게된다.

    C 시리얼 통신 클래스 - C silieol tongsin keullaeseu
    C 시리얼 통신 클래스 - C silieol tongsin keullaeseu
    C 시리얼 통신 클래스 - C silieol tongsin keullaeseu

    위와 같이 작성후 cpp 파일을 실행하면 아두이노에서 출력한 Hello World! 문구를 확인할 수 있다.

    이렇게 아두이노와 통신을 하기위한 모든 준비는 마쳤다. 그렇다고 데이터를 받기만 할 것인가?

    0.5초 주기로 데이터를 전송하여 아두이노에서는 그 값에 따라 LED를 제어해보도록 할 것이다.

    C 시리얼 통신 클래스 - C silieol tongsin keullaeseu
    C 시리얼 통신 클래스 - C silieol tongsin keullaeseu

    위 코드와 같이 수정하여 업로드하면 C++로 만든 프로그램에서 아두이노에게 ON, OFF의 string 데이터를 전달하고, 아두이노는 ON, OFF의 값을 인식하여 내장 13번 LED를 제어하는 것이다.

    이상 자세한 라이브러리의 사용법은 여기서 끝마치겠다.

    다음은 프로토콜 통신에 대해 공부해보자

    sketch_jul29a.ino

    0.00MB

    Project1.zip

    0.00MB