C# 이것저것/C# 기초

[C#] VSPE를 사용한 Serial통신 구현 - 2

agingcurve 2024. 2. 5. 11:09
반응형

https://datasirup.tistory.com/198

 

[C#] VSPE를 사용한 Serial통신 구현 - 1

Serial 통신이란? 시리얼 통신(Serial Communication)은 데이터를 한 비트씩 순차적으로 전송하는 통신 방식이며, 컴퓨터나 마이크로컨트롤러 등의 디지털 장치 간에 데이터를 주고받을 때 널리 사용된

datasirup.tistory.com

 

지난 포스팅에서 VSPE를 이용해서 시리얼통신의 동작을 확인해봤다.

이번에는 C# 콘솔 프로그래밍을 통해서 송신과 수신을 구현해보자

Serial 통신은 C#에서 기본적으로 제공해준다 System.IO.Ports에서 사용이 가능하다.

SerialPort_DataReceived 메서드를 통해서 데이터를 읽고 이것을 누적해서 보여줄 수 있도록 한다.

using System;
using System.IO.Ports;

class Program
{
    static SerialPort serialPort;

    static void Main()
    {
        // COM 포트 설정
        string portName = "COM2";
        int baudRate = 9600; // 통신 속도
        Parity parity = Parity.None; // 패리티
        int dataBits = 8; // 데이터 비트
        StopBits stopBits = StopBits.One; // 정지 비트

        // SerialPort 객체 생성
        serialPort = new SerialPort(portName, baudRate, parity, dataBits, stopBits);

        try
        {
            // 포트 열기
            serialPort.Open();
            Console.WriteLine($"COM 포트 {portName} 열림");

            // 데이터 수신 이벤트 등록
            serialPort.DataReceived += SerialPort_DataReceived;

            // 사용자가 Enter 키를 누를 때까지 대기
            Console.WriteLine("데이터 수신을 기다립니다. 종료하려면 Enter 키를 누르세요.");
            Console.ReadLine();
        }
        catch (Exception ex)
        {
            Console.WriteLine($"오류: {ex.Message}");
        }
        finally
        {
            // 포트 닫기
            if (serialPort.IsOpen)
            {
                serialPort.Close();
                Console.WriteLine($"COM 포트 {portName} 닫힘");
            }
        }
    }

    private static void SerialPort_DataReceived(object sender, SerialDataReceivedEventArgs e)
    {
        // 데이터 수신 시 호출되는 이벤트 핸들러
        SerialPort sp = (SerialPort)sender;
        string data = sp.ReadExisting();
        Console.WriteLine($"수신된 데이터: {data}");
    }
}

 

 

send를 보내보

 

데이터가 들어온다

 

반대로 C#에서 데이터를 보내보자

using System;
using System.IO.Ports;
using System.Threading;

class SerialCommunication
{
    static SerialPort serialPort;
    static bool isRunning = true;

    static void Main()
    {
        // COM 포트 설정
        string portName = "COM2";
        int baudRate = 9600; // 통신 속도
        Parity parity = Parity.None; // 패리티
        int dataBits = 8; // 데이터 비트
        StopBits stopBits = StopBits.One; // 정지 비트

        // SerialPort 객체 생성
        serialPort = new SerialPort(portName, baudRate, parity, dataBits, stopBits);
        serialPort.DataReceived += SerialPort_DataReceived;

        try
        {
            // 포트 열기
            serialPort.Open();
            Console.WriteLine($"COM 포트 {portName} 열림");


            // 메시지 전송 루프
            while (isRunning)
            {
                Console.Write($"메세지 입력 : ");
                string message = Console.ReadLine();
                SendMessage(message);
            }
        }
        catch (Exception ex)
        {
            Console.WriteLine($"오류: {ex.Message}");
        }
        finally
        {
            // 포트 닫기
            if (serialPort.IsOpen)
            {
                serialPort.Close();
                Console.WriteLine($"COM 포트 {portName} 닫힘");
            }
        }
    }

    private static void ReceiveMessages()
    {
        // 메시지 수신 루프
        while (isRunning)
        {
            if (serialPort.BytesToRead > 0)
            {
                string receivedMessage = serialPort.ReadLine();
                Console.WriteLine($"수신된 메시지: {receivedMessage}");
            }
        }
    }

    private static void SendMessage(string message)
    {
        // 메시지 전송
        serialPort.WriteLine(message);
        Console.WriteLine($"송신된 메시지: {message}");
    }

    private static void SerialPort_DataReceived(object sender, SerialDataReceivedEventArgs e)
    {
        // 데이터 수신 시 호출되는 이벤트 핸들러
        SerialPort sp = (SerialPort)sender;
        string receivedData = sp.ReadLine();
        Console.WriteLine($"수신된 데이터: {receivedData}");
    }
}

 

시리얼 포트쪽으로 잘 전송이 되었다.