-
C# RS232 통신.NET/Common 2022. 9. 4. 00:03
설비나 계측기에 대한 데이터값을 받을때 자주 사용합니다.
public partial class FormSerialblog : Form { SerialPort Port = new SerialPort(); Queue Datas = new Queue(); public FormSerialblog() { InitializeComponent(); Port.PortName = "COM1"; Port.BaudRate = 9600; Port.DataReceived += Port_DataReceived; Port.Open(); } private void Port_DataReceived(object sender, SerialDataReceivedEventArgs e) { Thread.Sleep(100); var readString = Port.ReadExisting(); Datas.Enqueue(readString); } private void btnSend_Click(object sender, EventArgs e) { Port.Write("Hello"); } }
내 장치에 연결되는 포트 번호 (주로 장치관리자나 연결 장치의 설정 프로그램에서 확인) BaudRate는 연결 대상 장치의 메뉴얼에서 확인 합니다.
패리티비트,스톱비트,... 등등의 설정은 왠만하면 기본으로 둬도 대부분 연결이 되지만, 아닌경우는 대상장치의 매뉴얼에 따라서 속성을 변경하면 됩니다.
단일연결만을 지원하기때문에 같은 PC에서 해당 포트로 Open 상태라면 에러가 발생할수 있습니다. Port Open시 에러가 발생되지 않으면 정상연결 된 것 이고, Port.Write로 대상장치에 메시지를 보낼수 있습니다.
데이터 수신시에는 Port객체의 DataRecieved 이벤트 메서드를 이용합니다. Recieve시 문자가 잘려나오는 일이 발생되는데 데이터 전체가 도착했을때 Recieve이벤트가 발생되는 구조가 아니기 때문입니다. 일정시간의 Thread.Sleep을 줘서 데이터가 올수있도록 합니다.
그리고 DataRecieved 이벤트는 비동기로 발생되므로 Form에 있는 Textbox나 label의 텍스트 등을 변경한다고하면 Cross Thread 처리를 해야합니다.
'.NET > Common' 카테고리의 다른 글
C# .NET 솔루션, 프로젝트 구조 (0) 2025.02.23 C# 문법 Null Safety (0) 2022.09.17 Regex 정규식 활용 그룹명 (0) 2022.09.07