Serial 통신 프로그램

Digeut·2024년 7월 6일

개발노트

목록 보기
3/6

💡목표

✔️콘솔 프로그램으로 만들기
✔️가상 포트 생성
✔️가상 포트 지정해서 연결
✔️송신 메시지를 수신 메시지로 받기
✔️exit라는 명령어로 연결해제하기

🪛설치

가상 포트 생성

Com0com 통해서 가상의 포트 설치

설치 후에 장치 관리자를 통해서 가상의 포트가 연결된걸 확인

🖥️프로젝트 만들기

Tool : visual studio 2022

새 프로젝트 생성 - 콘솔 어플리케이션 - (.NET 8.0) 선택

코드

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


class Program {
static SerialPort serialPort;
    static void Main(string[] args)
    {

        Console.WriteLine("Available COM Port : ");
        foreach (string s in SerialPort.GetPortNames()) {
        Console.WriteLine(" " + s);
        }

        Console.Write("Enter COM port value : ");
        string portName = Console.ReadLine();

        serialPort = new SerialPort(portName)
        {
            BaudRate = 115200,
            DataBits = 8,
            StopBits = StopBits.One,
            Parity = Parity.None
        };

        serialPort.DataReceived += new SerialDataReceivedEventHandler(DataReceivedHandler);

        try {
            serialPort.Open();
            Console.WriteLine($"Serial port {portName} opend");
        } catch (Exception e) {
            Console.WriteLine($"Failed to open serial port {portName} : ");
            return;
        }

        Console.WriteLine("Enter a message to send (type 'exit' to quit):");

        while (true)
        {
            string message = Console.ReadLine();

            /*string message = await Console.ReadLineAsync();*/

            if (message.ToLower() == "exit")
            {
                break;
            }
            try
            {
                Console.WriteLine($"Sending message: {message}");
                serialPort.Write(message + "\n");
            }
            catch (Exception ex)
            {
                Console.WriteLine($"Error sending message: {ex.Message}");
            }
        }

        /*Console.WriteLine("Press any key to close the application");
        Console.ReadKey();*/

        if (serialPort.IsOpen) {
            serialPort.Close();
            Console.WriteLine("Serial port closed");
        }

    }
    private static void DataReceivedHandler(object sender, SerialDataReceivedEventArgs e)
    {
        try
        {
            string data = serialPort.ReadExisting();
            Console.WriteLine($"Data received: {data}");
        }
        catch (InvalidOperationException ex)
        {
            Console.WriteLine($"Invalid operation while reading: {ex.Message}");
        }
        catch (Exception ex)
        {
            Console.WriteLine($"Error while reading data: {ex.Message}");
        }
    }
}

실행


실행하면 지금 사용가능한 포트목록이 보이고 포트번호 입력가능


포트 번호 입력하면 연결된 포트번호를 알려주고 종료를 위해서는 exit입력
송신 메시지를 보내면 어떤 메시지를 보냈는지 알려주는 수신 메시지 보인다


exit를 입력하면 포트 연결이 해제되고 종료된다.

🔧 개선 사항

아직 파악은 못했지만 2문장 이상 입력이 되지 않는다
무슨 문장이든 2문장이 넘어버리면 아무것도 먹히지 않는 상태
ctrl + c 를 통한 포트 해제까지는 된다

찾아보니 동기식 / 비동기식 방식의 문제인것 같은데 수정필요!

profile
백엔드 개발자 지망생

0개의 댓글