반응형
https://datasirup.tistory.com/198
[C#] VSPE를 사용한 Serial통신 구현 - 1
Serial 통신이란? 시리얼 통신(Serial Communication)은 데이터를 한 비트씩 순차적으로 전송하는 통신 방식이며, 컴퓨터나 마이크로컨트롤러 등의 디지털 장치 간에 데이터를 주고받을 때 널리 사용된
datasirup.tistory.com
지난 포스팅에서 VSPE를 이용해서 시리얼통신의 동작을 확인해봤다.
이번에는 C# 콘솔 프로그래밍을 통해서 송신과 수신을 구현해보자
Serial 통신은 C#에서 기본적으로 제공해준다 System.IO.Ports에서 사용이 가능하다.
SerialPort_DataReceived 메서드를 통해서 데이터를 읽고 이것을 누적해서 보여줄 수 있도록 한다.
using System;
using System.IO.Ports;
class Program
{
static SerialPort serialPort;
static void Main()
{
// COM 포트 설정
string portName = "COM2";
int baudRate = 9600; // 통신 속도
Parity parity = Parity.None; // 패리티
int dataBits = 8; // 데이터 비트
StopBits stopBits = StopBits.One; // 정지 비트
// SerialPort 객체 생성
serialPort = new SerialPort(portName, baudRate, parity, dataBits, stopBits);
try
{
// 포트 열기
serialPort.Open();
Console.WriteLine($"COM 포트 {portName} 열림");
// 데이터 수신 이벤트 등록
serialPort.DataReceived += SerialPort_DataReceived;
// 사용자가 Enter 키를 누를 때까지 대기
Console.WriteLine("데이터 수신을 기다립니다. 종료하려면 Enter 키를 누르세요.");
Console.ReadLine();
}
catch (Exception ex)
{
Console.WriteLine($"오류: {ex.Message}");
}
finally
{
// 포트 닫기
if (serialPort.IsOpen)
{
serialPort.Close();
Console.WriteLine($"COM 포트 {portName} 닫힘");
}
}
}
private static void SerialPort_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
// 데이터 수신 시 호출되는 이벤트 핸들러
SerialPort sp = (SerialPort)sender;
string data = sp.ReadExisting();
Console.WriteLine($"수신된 데이터: {data}");
}
}
send를 보내보
데이터가 들어온다
반대로 C#에서 데이터를 보내보자
using System;
using System.IO.Ports;
using System.Threading;
class SerialCommunication
{
static SerialPort serialPort;
static bool isRunning = true;
static void Main()
{
// COM 포트 설정
string portName = "COM2";
int baudRate = 9600; // 통신 속도
Parity parity = Parity.None; // 패리티
int dataBits = 8; // 데이터 비트
StopBits stopBits = StopBits.One; // 정지 비트
// SerialPort 객체 생성
serialPort = new SerialPort(portName, baudRate, parity, dataBits, stopBits);
serialPort.DataReceived += SerialPort_DataReceived;
try
{
// 포트 열기
serialPort.Open();
Console.WriteLine($"COM 포트 {portName} 열림");
// 메시지 전송 루프
while (isRunning)
{
Console.Write($"메세지 입력 : ");
string message = Console.ReadLine();
SendMessage(message);
}
}
catch (Exception ex)
{
Console.WriteLine($"오류: {ex.Message}");
}
finally
{
// 포트 닫기
if (serialPort.IsOpen)
{
serialPort.Close();
Console.WriteLine($"COM 포트 {portName} 닫힘");
}
}
}
private static void ReceiveMessages()
{
// 메시지 수신 루프
while (isRunning)
{
if (serialPort.BytesToRead > 0)
{
string receivedMessage = serialPort.ReadLine();
Console.WriteLine($"수신된 메시지: {receivedMessage}");
}
}
}
private static void SendMessage(string message)
{
// 메시지 전송
serialPort.WriteLine(message);
Console.WriteLine($"송신된 메시지: {message}");
}
private static void SerialPort_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
// 데이터 수신 시 호출되는 이벤트 핸들러
SerialPort sp = (SerialPort)sender;
string receivedData = sp.ReadLine();
Console.WriteLine($"수신된 데이터: {receivedData}");
}
}
시리얼 포트쪽으로 잘 전송이 되었다.
'C# 이것저것 > C# 기초' 카테고리의 다른 글
using문과 IDisposable을 이용한 리소스 해제 (0) | 2025.04.07 |
---|---|
[C#] ThreadPool & EventWaitHandle 기초 (0) | 2024.02.22 |
[C#] VSPE를 사용한 Serial통신 구현 - 1 (0) | 2024.02.05 |