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 |
---|