반응형
[C#] 시리얼통신 윈폼(Winform) 아스키 모드, 바이트 모드 디스플레이 SerialPort DataReceived() display ascii or bytes(Hex)
C# SerialPort
안녕하세요 정보처리마법사 입니다.
이번 포스팅의 주제는 시리얼통신에 관한 내용입니다.
데이터를 받을 때 페이지 맨 아래 소스코드와 같이 ReadByte() 메소드를 사용하지 않고 그냥 ReadExisting()
메소드를 사용하면 아스키형식으로 눈으로 바로 확인 할 수 있지만 아래와 같이 아스키 형식과 바이트(Hex) 형식
둘다 눈으로 확인하고 싶다면 다음과 같이 코딩을 하면 됩니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 | private void serialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e) { string rcvData_ascii_format = string.Empty; string rcvData_byte_format = string.Empty; while (serialPort1.BytesToRead != 0) { var num = 0; int[] arr_rcvData_bytes = new int[7]; char[] arr_rcvData_char = new char[7]; while (num < 7) { arr_rcvData_bytes[num] = serialPort1.ReadByte(); arr_rcvData_char[num] = Convert.ToChar(arr_rcvData_bytes[num]); rcvData_byte_format += arr_rcvData_bytes[num].ToString("X2"); rcvData_ascii_format += arr_rcvData_char[num]; num++; } } this.Invoke(new Action(delegate () { textBox3.AppendText("데이터 입력받는 중.\r\n"); textBox3.AppendText("Ascii Format : " + rcvData_ascii_format + "\r\n"); textBox3.AppendText(" Byte Format : " + rcvData_byte_format + "\r\n"); })); serialPort1.Write(rcvData_ascii_format); } | cs |
이상으로 포스팅을 마칩니다. 감사합니다.
아래 소스코드는 개인 참고용 입니다. 무시하셔도 됩니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 | private int[] arr_rcvData_bytes = new int[7]; private char[] arr_rcvData_char = new char[7]; private void serialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e) { string rcvData_ascii_format = string.Empty; string rcvData_byte_format = string.Empty; while (serialPort1.BytesToRead != 0) { var num = 0; while (num < 7) { arr_rcvData_bytes[num] = serialPort1.ReadByte(); arr_rcvData_char[num] = Convert.ToChar(arr_rcvData_bytes[num]); rcvData_byte_format += arr_rcvData_bytes[num].ToString("X2"); rcvData_ascii_format += arr_rcvData_char[num]; num++; } } byte[] arr_sendData_byte = new byte[] { 02, 01, 03, 64, 64, 64, 33, 03 }; this.Invoke(new Action(delegate () { textBox3.AppendText("데이터 입력받는 중.\r\n"); textBox3.AppendText("Ascii Format : " + rcvData_ascii_format + "\r\n"); textBox3.AppendText(" Byte Format : " + rcvData_byte_format + "\r\n"); // 받은 데이터 for (int i = 0; i < 7; i++) { arr_tb[i].Text = arr_rcvData_bytes[i].ToString("X2"); } // 보낸 데이터 for (int i = 0; i < 8; i++) { arr_tb[i + 7].Text = arr_sendData_byte[i].ToString("X2"); } })); // 테스트 용도로 받은 데이터 그대로 보냄. // serialPort1.Write(rcvData_ascii_format); // 임시 데이터 자릿수에 맞게 전송. serialPort1.Write(arr_sendData_byte, 0, 8); } | cs |
Fin.
잘 못 된 정보가 있으면 말씀해주세요~
공감버튼 클릭은 작성자에게 큰 힘이 됩니다. 행복한 하루 되세요.
반응형