C 언어에서 Hexa-to-String으로 변환

2023년 07월 13일 by 진아사랑해

    C 언어에서 Hexa-to-String으로 변환 목차
반응형

개요

수신되는 메시지를 출력하여 볼 수 있도록 하기 위해 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 

 

반응형