C#_SerialPort byte[]로 송수신하기

Today Jeeho Learned·2022년 11월 18일
0

C#

목록 보기
9/17
post-thumbnail

INTRO

이번주에 주어진 2주차 과제를 진행중에 데이터를 송수신하는 부분에서 계속해서 string타입형태를 사용했었다. 왜냐면 이것이 가장 직관적이기때문에 송수신할 때 가장 편리하다고 생각했다. 그리고 그렇게 해서 과제를 완성했다. 그런데 string 형태말고 byte[]형태로 송수신이 많이 이루어지니 코드를 변경해보라는 말씀을 듣고, 키워드를 주신 것들을 위주로 찾아가면서 학습한 것을 정리하고자 한다.

Byte[]를 왜쓰는건가?

그동안 string 타입 등을 활용하여 작성했는데! 사실은 string을 사용한다해도 문자로 데이터가 전송되는 것이 아니다. 실질적으로는 byte[]로만 전송이 된다! 클래스에서 byte[]로 변환해서 보내는 코드가 내장되어 있는 것이다. 그렇지만 문자열은 char셋에 따라서 1글자의 코드값 하나하나가 다르다. byte[]로 전송하게 되면 이런것들을 직접 컨트롤할 수가 있다.

Int32 to Byte


작성한 코드를 살펴보자!
LEDTEST버튼을 클릭시에 실행되는 이벤트메소드의 코드이다.
만들어놓은 combobox에서 선택한 값의 인덱스에 1을 더하여 LED와 TYPE를 만들어주었다,
그리고 byte[]형태로 전송해주기 위해서 byte[]배열을 만들고, int로 만들어놓은 led와 type를 byte형태로 변경하여 넣어주었다. 이때 Convert.ToByte()를 사용하여 int형에서 byte로 변경해주었다.
그리고 Write(배열이름,배열의시작인덱스,배열보내줄사이즈)를 사용하여 데이터를 byte[]형태로 전송해주었다.

String to Byte

UART TEST버튼을 클릭시에 실행되는 이벤트메소드와 관련된 코드이다.
string형태의 testmessage코드가 byte[]형태로 변환해서 보내주는 과정이다.
string에서 byte[]로 변환하는 것은

System.Text.Encoding.UTF8.GetBytes()

를 사용해서 변환해주었다. 그리고 같은 write함수를 사용해서 전송해주었다.

Byte to Int , Byte to String


위에서 전송한 데이터를 수신하고 처리하는 port의 received 메서드의 관련한 코드이다.
simulator포트에 수신되는 모든 데이터는 이 메소드 안에서 받기때문에 받는 데이터의 정보를 분별해서 필요한 로직들을 각각 작성해줘야한다.(현재는 이렇게 알고있음)

int RecvSize = SimulatorSerialport.BytesToRead;

이것을 사용하여 byte[]형태로 들어온 배열의 크기값을 설정한다.
LED / TYPE에 관련한 부분은 크기가 2인 Byte[]로 보내주었기 때문에 조건값을 배열의 크기가 2인 경우로 처리하여 필요한 값들을 처리해준다.

두번째로 UART와 관련된 부분에서는 송신하는 데이터의 크기를 4로 만들어주었기 때문에 배열의 크기가 2보다 큰 경우를 조건값을 주었고, 받은 Byte[]형태를 string 형태로 형변환을 해주었다.

ReceiveData = Encoding.UTF8.GetString(UARTdata);

를 사용했고, UTF8을 기준으로 인코딩을 해주었기 때문에 같은 조건으로 다시 변환을 해준다.
그렇게 string 형태로 받은 값을 내가 설정해준 조건에 맞으면 TEST_OK라는 string 타입으로 전송해주었다! 위와 같은 형식으로 또 다시 받는 부분을 설정해주면 된다.

profile
기록해야 (살아)남는다 !

0개의 댓글