C#

C# Serial 통신

F급 개발자 2023. 7. 24. 00:00
728x90
반응형

C# Serial 통신을 구축하는 방법을 진행하겠습니다.

 

코드는 간단하게 Serial Open, Received, Closed, Send  4가지로 나누어집니다.

 

using은 아래 System.IO.Ports; 를 사용합니다.

using System.IO.Ports;

 

- SerialPort를 전역 변수로 선언합니다.

 SerialPort serialPort = new SerialPort();

 

- Serial Open

 public void SerialOpen(string PortName, string BaudRate, string DataBits, string stopBits, string parity)
        {
            try
            {
                serialPort.PortName = PortName;
                serialPort.BaudRate = int.Parse(BaudRate);
                serialPort.DataBits = int.Parse(DataBits);
                serialPort.StopBits = (StopBits)Enum.Parse(typeof(StopBits), stopBits);
                serialPort.Parity = (Parity)Enum.Parse(typeof(Parity), parity);
                serialPort.DataReceived += new SerialDataReceivedEventHandler(serialPort_DataReceived);
                serialPort.Open();             
            }
            catch
            {                
                MessageBox.Show("COM 포트 혹은 선택되지 않은 항목이 있습니다.", "Serial Conncet Error", MessageBoxButton.OK, MessageBoxImage.Error);                
                return;
            }
        }

 - Open 함수를 호출할 때 Port, 통신속도, 데이터비트, 패리티, 정지비트, 흐름제어의 인자값을 받아 Serial을 Open 합니다. 

 

- Serial Received

 public void serialPort_DataReceived(object sender, SerialDataReceivedEventArgs e)
        {
            Thread.Sleep(50);
            int RecvSize = serialPort.BytesToRead;
            if (RecvSize != 0)
            {
                byte[] buff = new byte[RecvSize];
                serialPort.Read(buff, 0, RecvSize);

            }

        }

 - if(RecvSize != 0)문 안에서 데이터를 받아서 파싱 하면 됩니다.

 

 - Thread.Sleep(50)을 쓰는 이유는 Serial 데이터가 잘릴 수 있기 때문에 안전상의 이유로 작성하였습니다. 

    물론, 데이터를 버퍼에 쌓고 버퍼의 길이를 확인 후 해당 데이터를 파싱 할 수 도 있습니다. 

      참고로 Thread.Sleep(ms); 대신 Task.Delay(ms)가 더 안전하니 Task.Delay(ms)를 쓰길 바랍니다.

 

- Serial Close

  public void SerialClose()
        {
            serialPort.Close();
        }

 

- Serial Send

 public void SerialSend(byte[] send_data)
 {
   try
   {              
	  serialPort.Write(send_data, 0, send_data.Length);         
   }
   catch
   {               
              
   }
}

 

아래는 전체 Class 코드입니다.

 public class Prs_Serial
    {
        public SerialPort serialPort = new SerialPort();        

        //시리얼 오픈
        public void SerialOpen(string PortName, string BaudRate, string DataBits, string stopBits, string parity)
        {
            try
            {
                serialPort.PortName = PortName;
                serialPort.BaudRate = int.Parse(BaudRate);
                serialPort.DataBits = int.Parse(DataBits);
                serialPort.StopBits = (StopBits)Enum.Parse(typeof(StopBits), stopBits);
                serialPort.Parity = (Parity)Enum.Parse(typeof(Parity), parity);
                serialPort.DataReceived += new SerialDataReceivedEventHandler(serialPort_DataReceived);
                serialPort.Open();
                Serial_On_Off = 1;
            }
            catch
            {
                Serial_On_Off = 0;
                MessageBox.Show("COM 포트 혹은 선택되지 않은 항목이 있습니다.", "Serial Conncet Error", MessageBoxButton.OK, MessageBoxImage.Error);                
                return;
            }
        }

        //시리얼 데이터 리시브
        public void serialPort_DataReceived(object sender, SerialDataReceivedEventArgs e)
        {
            Thread.Sleep(50);
            int RecvSize = serialPort.BytesToRead;
            if (RecvSize != 0)
            {
                byte[] buff = new byte[RecvSize];
                serialPort.Read(buff, 0, RecvSize);


                Prs_Parsing.PasringData(buff);
            }

        }

        //시리얼 클로즈
        public void SerialClose()
        {
            serialPort.Close();
        }

        //시리얼 데이터 전송
        public void SerialSend(byte[] send_data)
        {
            try
            {
                serialPort.Write(send_data, 0, send_data.Length);
            }
            catch
            {

            }
        }
    }
728x90
반응형

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

[C# / WPF] Dictionary  (0) 2023.07.25