python & 라즈베리파이
C 언어에서 Hexa-to-String으로 변환
진아사랑해
2023. 7. 13. 16:22
반응형
개요
수신되는 메시지를 출력하여 볼 수 있도록 하기 위해 hexa로 수신되는 메시지를 String으로 변환하여
메시지를 터미널 창에 출력하도록 하였습니다.
다양한 방법으로 hexa를 변경하는 방법이 있으나, 맘에 들지 않아 기록으로 남깁니다
Hexa를 String으로 변경하는 방법
// Configure a temporary buffer for the incoming data
uint8_t *data = (uint8_t *) malloc(BUF_SIZE + 1);
while (1) {
// UART로 부터 메시지를 수신합니다.
// len은 수신된 메시지의 길이를 받습니다.
int len = uart_read_bytes(ECHO_UART_PORT_NUM, data, (BUF_SIZE - 1), 20 / portTICK_PERIOD_MS);
if (len) {
data[len] = '\0';
ESP_LOGI(TAG, "len = %d", len);
char *str_buf= (char *) malloc(len*10); // String으로 저장하기 위한 메모리를 할당 받습니다.
int temp = 0;
for(uint8_t i = 0; i < len; i++){ // temp를 사용하여 수신버퍼 위치를 변경합니다.
temp += snprintf(str_buf + temp, 30 - temp, "%x ", (unsigned int)*data++); // 수신 버퍼에 있는 1 byte를 str_buf에 넣습니다.
printf("temp = %d str_buf = %s\n", temp, str_buf); // 확인하기 위해 출력을 합니다.
}
ESP_LOGI(TAG, "Recv data: %2s", (char *) data);
ESP_LOGI(TAG, "Recv str_buf: %s", (char *) str_buf);
free(str_buf);
if(len == 10) rcv_msg_parsing(data);
else {
uart_flush(ECHO_UART_PORT_NUM);
}
}
// 아래 delay()가 없으면 고정적으로 계속 수행이 되어 watchdog를 검사하는 IDLE task가 동작할 시간이 없다
// 아니면 menuconfig에서 watchdog을 disable 시켜야 한다
vTaskDelay(10/ portTICK_PERIOD_MS);
}
UART로 입력된 메시지가 0xB5 2 3 4 5 6 7 8 9 0인 경우에
출력 메시지는
[0;32mI (153889) UART TEST: len = 10␛[0m
temp = 3 str_buf = b5
temp = 5 str_buf = b5 2
temp = 7 str_buf = b5 2 3
temp = 9 str_buf = b5 2 3 4
temp = 11 str_buf = b5 2 3 4 5
temp = 13 str_buf = b5 2 3 4 5 6
temp = 15 str_buf = b5 2 3 4 5 6 7
temp = 17 str_buf = b5 2 3 4 5 6 7 8
temp = 19 str_buf = b5 2 3 4 5 6 7 8 9
temp = 21 str_buf = b5 2 3 4 5 6 7 8 9 0
반응형