좋아요! C#에서 COM 포트(시리얼 포트) 통신 프로그램을 만드는 기본적인 방법을 단계별로 알려드릴게요. Windows 환경에서는 `Systehttp://m.IO.Ports.SerialPort` 클래스를 사용하면 됩니다. 아래는 전체 구조를 이해하기 쉽도록 간단한 예제와 설명입니다.
---
## 1️⃣ 기본 준비
* Visual Studio에서 C# WinForms 또는 Console 프로젝트 생성
* `Systehttp://m.IO.Ports` 네임스페이스 사용
```csharp
using System;
using Systehttp://m.IO.Ports;
class Program
{
static void Main(string[] args)
{
// 시리얼 포트 생성
SerialPort serialPort = new SerialPort();
// 포트 설정
serialPort.PortName = "COM3"; // 실제 연결된 포트에 맞게 변경
serialPort.BaudRate = 9600; // 통신 속도
serialPort.Parity = Parity.None;
serialPort.DataBits = 8;
serialPort.StopBits = StopBits.One;
serialPort.Handshake = Handshake.None;
// 데이터 수신 이벤트 등록
serialPort.DataReceived += new SerialDataReceivedEventHandler(DataReceivedHandler);
try
{
// 포트 열기
serialPort.Open();
Console.WriteLine("포트 열림. 데이터 수신 대기 중...");
// 데이터 전송 예제
Console.WriteLine("메시지 입력 후 Enter를 누르면 전송됩니다. 종료하려면 'exit' 입력");
string input;
while ((input = Console.ReadLine()) != "exit")
{
serialPort.WriteLine(input);
}
serialPort.Close();
Console.WriteLine("포트 닫힘.");
}
catch (Exception ex)
{
Console.WriteLine("오류: " + ex.Message);
}
}
private static void DataReceivedHandler(object sender, SerialDataReceivedEventArgs e)
{
SerialPort sp = (SerialPort)sender;
string data = sp.ReadExisting();
Console.WriteLine("수신: " + data);
}
}
```
---
## 2️⃣ 주요 설명
| 항목 | 설명 |
| -------------- | ---------------------------------- |
| `PortName` | COM 포트 이름 (예: COM1, COM3 등) |
| `BaudRate` | 통신 속도 (9600, 115200 등) |
| `Parity` | 패리티 비트 (None, Odd, Even) |
| `DataBits` | 데이터 비트 수 (보통 8) |
| `StopBits` | 스톱 비트 (1, 1.5, 2) |
| `Handshake` | 하드웨어/소프트웨어 흐름 제어 (None, XOnXOff 등) |
| `DataReceived` | 데이터 수신 이벤트 처리 |
---
## 3️⃣ GUI 버전(WinForms)에서는
* `SerialPort` 객체를 폼에 추가하고 버튼 클릭 이벤트로 포트 열기/닫기
* 텍스트박스와 리스트박스로 송수신 구현 가능
```csharp
serialPort1.PortName = comboBoxPort.Text;
serialPort1.BaudRate = int.Parse(comboBoxBaud.Text);
serialPort1.Open();
```
* `serialPort1.DataReceived` 이벤트를 사용하면 수신 데이터를 실시간 표시 가능
---
💡 **팁**
1. 포트 사용 중이면 `UnauthorizedAccessException` 발생 → 다른 프로그램에서 포트 사용 중인지 확인
2. 수신 이벤트는 별도 스레드에서 실행되므로 UI 업데이트 시 `Invoke` 필요
---
원하면 제가 **WinForms GUI 형태**로 만들어서 **포트 선택, 송수신, 로그 표시**까지 가능한 완전한 예제를 만들어 드릴 수도 있어요.
혹시 콘솔 버전으로 충분한가요, 아니면 GUI로 만들고 싶으신가요?