티스토리 뷰

embedded

Arduino Serial 로 hex 전송하기

사용자 fistful 2018. 9. 4. 15:31
반응형

개요

 

시리얼 custom protocol 정의하고 hex 값을 전송해보자.

 

 

결과부터 말하자면 (TL;DR)

 

- 패킷을 char array 정의하고 값을 넣은 다음에

- 만약 char sendPacket[10]; 이라 정의하였다면

- Serial.write(sendPacket, sizeof(sendPacket)); 이라고 보내면 된다.

 

Serial.print Serial.write

 

참고링크 이미지 캡처 출처: https://goo.gl/be69UG

 

Serial.print ASCII 시리얼포트로 내보내고

Serial.write Byte 시리얼 포트로 내보낸다.

 


 

protocol 정의

 

간단히 아래와 같은 프로토콜을 정의해보았음.

 

구분

STX

OP Code

Length

Sensor 1

Sensor 2

Sensor 3

Sensor 4

ETX

사이즈

0x02

0x30

2 Bytes (Little Endian)

1 Byte

1 Byte

1 Byte

1 Byte

0x03

예시

0x02

0x30

0x0400

0x15

0x43

0x32

0x93

 

 

 

STX, ETX

 

- 패킷의 시작과 끝을 알림

- 수신측에서는 시리얼을 감시하다가 STX ETX 체크함

OPCode (Operation code)

- 패킷의 명령어들을 설정 가능.

- reset, add, delete, ack 등의 명령에 코드를 할당할 있겠다.

- 여기에선 그냥 0x30 이라는 OPCode 있다고 하자

Length

- 순수한 데이터의 길이

- 여기서는 Sensor 1-4 = 4바이트므로  4 되며

- Little Endian 으로 표현하며 0x0400 된다.

- 수신측에서는 길이정보를 파싱하는데, 데이터 누락을 체크하는데 있겠다.

Data

- 여기서는 Sensor 1, 2, 3, 4

* CRC

- ETX 이전에 CRC 값을 넣어서 오류 검증을 수도 있다.

 

// Arduino - Send HEX value to Serial

void setup() {
  Serial.begin(9600);
}

void loop() {
  // 패킷준비
  char serialPacket[9] = {0,};

  serialPacket[0] = 0x02;  // STX
  serialPacket[1] = 0x30;  // OP CODE
  serialPacket[2] = 0x04;
  serialPacket[3] = 0x00;  
  serialPacket[4] = 0x15;
  serialPacket[5] = 0x43;
  serialPacket[6] = 0x32;
  serialPacket[7] = 0x93;
  serialPacket[8] = 0x03;  // ETX

  Serial.println("Sending");
  Serial.write(serialPacket, sizeof(serialPacket));
  Serial.println();
  delay(1500);

  // 비교해보기
  // print 와 write 비교, char, int8_t, uint8_t 비교
  int8_t testData = 0x43;
  Serial.println(testData);
  Serial.println((uint8_t)testData);
  Serial.println((char)testData);

  Serial.write(testData);
  Serial.println();
  Serial.write((uint8_t)testData);
  Serial.println();
  Serial.write((char)testData);
  Serial.println();  
  delay(1500);

}

전송해보자

 

- char array 패킷을 만들어서 Serial.write() 전송하였음

- print write 비교 하였음

- int8_t, uint8_t, char 데이터 타입으로 보내는 경우도 비교하였음

 


 

 

모니터링 방법

 

아두이노 IDE

 

Seiral monitor 로는 HEX 확인이 어렵다.

 

Hterm

 

깔끔하고 이쁘다. 역시 독일 형님들: https://www.heise.de/download/product/hterm-53283

 

- UART 설정을 해주고

- Newline 설정 해주고

- 데이터를 형식을 (중복선택하여) 설정. 여기서는 Ascii, Hex, Bin 선택하였다.

1) "Sending" 이라고 Ascii 전송되었다.

2) 우리가 정의한 custom packet 전송되었다. 02 30 04 00 15 43 32 93 03

Serial.println() // int8_t 전송

십진수로 67이므로 Ascii 문자인 6 7 전송됨

Serial.println() // uint8_t 전송

int8_t 마찬가지로 Ascii 문자인 6 7 전송됨

Serial.println() // char 전송

Ascii code 0x43 C 전송됨. HEX 값은 0x43

Seriial.write()

- int8_t, uint8_t, char 모두 동일

0x43 값이 전달됨

 

 


 


반응형
댓글
댓글쓰기 폼