COM 통신을 위한 클래스에 대한 설명을 기술을 합니다.
여기서는 간단하게 사용하는 예제만 다루며, 좀 더 자세히 다루고자 하시면 해당 클래스에 대한 MSDN의 문서인 다음을 참고하여 작업하시는게 좋을 것 같습니다.
https://docs.microsoft.com/ko-kr/dotnet/api/system.io.ports.serialport?view=dotnet-plat-ext-6.0
SerialPort 클래스 (System.IO.Ports)
직렬 포트 리소스를 나타냅니다.
docs.microsoft.com
먼저 다음과 같이 System.IO.Ports;를 추가해 줍니다.
using System.IO.Ports;
그리고 SerialPort 객체를 만들고 다음과 같인 접속하고자 하는 포트 정보들을 기입합니다.
SerialPort serialPort = new SerialPort();
serialPort.PortName = "COM4";
serialPort.BaudRate = 4800;
serialPort.Parity = Parity.None;
serialPort.DataBits = 8;
serialPort.StopBits = StopBits.One;
serialPort.ReadBufferSize = 800;
접속된 포트로부터 메시지가 날라 왔을 때 처리는 다음과 같이 진행하면 됩니다.
serialPort.DataReceived += OnSerialDataReceived;
private void OnSerialDataReceived(object sender, SerialDataReceivedEventArgs e)
{
var serialPort = (SerialPort)sender;
string readData = serialPort.ReadExisting();
if (readData == null || readData.Equals("")) return;
/// 받은 메시지 처리 ///
}
포트 정보를 모두 기입하였으면 이제 접속을 시도합니다. 다음과 같이 Open() 함수를 사용하시면 접속을 시도할 수 있으면 IsOpen 상태를 읽으면 접속을 성공했는지 여부를 알 수 있습니다.
bool connectionFailed = true;
for (int tryCount = 0; tryCount < 3; tryCount++)
{
try
{
serialPort.Open();
if (serialPort.IsOpen)
{
// 집속되었다.
connectionFailed = false;
break;
}
}
catch (System.IO.IOException)
{
Thread.Sleep(1000);
continue;
}
}
if (connectionFailed)
{
System.Windows.Forms.MessageBox.Show("접속실패");
}
Open() 함수는 리턴값이 따로 없습니다. 위의 코드에서 Open() 함수를 try ~ catch 문으로 묶은 것처럼 Open() 함수 실패시 System.IO.IOException 가 발생함을 주의하셔야 겠습니다. 위의 내용을 모아서 간단하게 메시지를 받았을때 해당 메시지가 팝업으로 뜨는 클래스를 만들어 보았습니다.
using System.IO.Ports;
namespace TestProject
{
class Test
{
SerialPort serialPort = new SerialPort();
private string receivedMessage = "";
public Test()
{
serialPort.PortName = "COM4";
serialPort.BaudRate = 4800;
serialPort.Parity = Parity.None;
serialPort.DataBits = 8;
serialPort.StopBits = StopBits.One;
serialPort.ReadBufferSize = 800;
serialPort.DataReceived += OnSerialDataReceived;
bool connectionFailed = true;
for (int tryCount = 0; tryCount < 3; tryCount++)
{
try
{
serialPort.Open();
if (serialPort.IsOpen)
{
// 집속되었다.
connectionFailed = false;
break;
}
}
catch (System.IO.IOException)
{
Thread.Sleep(1000);
continue;
}
}
if (connectionFailed)
{
System.Windows.Forms.MessageBox.Show("접속실패");
}
}
private void OnSerialDataReceived(object sender, SerialDataReceivedEventArgs e)
{
var serialPort = (SerialPort)sender;
string readData = serialPort.ReadExisting();
if (readData == null || readData.Equals("")) return;
/// 받은 메시지 처리 ///
receivedMessage += readData;
var endCharPos = receivedMessage.IndexOf('\n');
if (endCharPos < 0) return;
var text = receivedMessage.Substring(0, endCharPos).Trim();
System.Windows.Forms.MessageBox.Show(text);
receivedMessage = receivedMessage.Substring(endCharPos + 1);
}
}
}
저는 위의 기능을 하드웨어 없이 COM 통신 테스트 해보기 위해 다음의 com2com을 사용하였습니다.
http://com0com.sourceforge.net/
Null-modem emulator (com0com) - virtual serial port driver for Windows
Null-modem emulator (com0com) The Null-modem emulator is an open source kernel-mode virtual serial port driver for Windows, available freely under GPL license. The Null-modem emulator allows you to create an unlimited number of virtual COM port pairs and u
com0com.sourceforge.net
인터넷에서 찾아보니 VPSE 라는 프로그램이 좀더 편해 보였으나, 64비트 지원은 무료가 아니였습니다. 32비트는 무료지만, 프로그램이 아니라 32비트 환경에서 무료라고 적혀 있어서 라이센스 문제가 생길 것 같아서 사용하지 않았습니다. (Tool to create virtual serial port devices. Free for using in 32 bit environments (for example, Windows 10 Home 32 bit))
Com0Com을 설치하면 기본세팅은 Input이 COM4로, Output이 COM5로 되어 있습니다. 이렇게 되면 COM4에 접속후 Send하면 COM5에서 Receive 받게 되고, COM5에서 Send하게 되면 COM4에서 Receive 하게 됩니다. COM5는 SerialPortMon 등의 COM 테스트 프로그램을 이용하고, COM4로 개발중인 프로그램으로 접속테스트하면, 통신정보를 확인하며 테스트 하실 수 있습니다.
'C#' 카테고리의 다른 글
[C# / WinUI3] User Control에서 Property 및 Event 추가 (0) | 2023.08.28 |
---|---|
win32 API로 디스플레이 확장/복제 설정하기 (0) | 2023.04.17 |
[C#.NET] C# 에서 C++ Windows Runtime Component 사용하기 (0) | 2022.12.02 |
[C#.NET] Laptop Battery 정보 얻기 (Power Status) (0) | 2022.09.26 |