[英]How to convert uint8_t from uart_read_bytes to a char or something that can be added to cJSON object?
在這里,我從與另一個正在發送字節的設備進行通信的UART中讀取數據。 如果我得到3字節的整數值,如何最好地將其轉換為可以使用cJSON發送的值。 我可以獲取該值並對其進行迭代,但是一旦將其放入char數組中,我什至無法再看到該值。 思考?
{
uint8_t buf[BUF_SIZE];
memset(buf, 0, sizeof(buf));
// Read data from the UART
int checkIt = uart_write_bytes(UART_NUM_2, (const char *)hex,
strlen(hex));
ESP_LOGI(LOG_TAG, "this is the length of transmit: %i: ", checkIt);
int len2 = uart_read_bytes(UART_NUM_2, buf, BUF_SIZE - 1, 1000
portTICK_RATE_MS);
ParseData(buf);
}
ParseData(char * data)
{
//initialize char array to zeros
char temporary[4] = {0};
for(int i=0; i<3; i++)
{
//first two bytes are not needed, so skip them for now
temporary[i] = data[i+2];
ESP_LOGI(LOG_TAG, " temporary # %i %i ", i, temporary[i]);
}
temporary[3] = '\0';
ESP_LOGI(LOG_TAG, " temp char contents update %s ", temporary;
}
for循環將向我顯示每個值,例如1、2、3(作為整數發送的單個整數,不是字符串,也不是'1','2','3'-但是我不想將其組合到123中,這就是我設置臨時數組的原因。即使我不向其中添加空字符,它也不會打印任何內容。如果我可以將其設置為單個值(123),甚至可以是一個char(字符串類型) ),然后可以將其添加到cJSON對象並發送。
如果行:
ESP_LOGI(LOG_TAG, " temporary # %i %i ", i, temporary[i]);
如果表示整數值1、2、3,則數據是整數數據,而不是字符數據。 要將數據表示為一串十進制數字字符,請進行以下更改:
temporary[i] = data[i+2];
至
temporary[i] = '0' + data[i+2];
但是,似乎不太可能以這種方式解釋數據-這是一種傳輸整數數據的非常低效且浪費的方法。 您確定他的數據實際上不是單個24位整數,而是循環和數組,實際上您需要:
int value = data[2] << 16 | data[3] << 8 | data[4] ;
要么
int value = data[4] << 16 | data[3] << 8 | data[2] ;
取決於數據的字節順序?
因此,看來我的情況是,我將從UART讀取的單個字節轉換為整數
char data[3] = {0};
data[0] = 0x01
data[1] = 0x02
data[2] = 0x03
ParseData(data);
void ParseData(uint8_t * data)
{
uint32_t val = (data[0] * 100) + (data[1] * 10) + data[2];
ESP_LOGI(LOG_TAG, " val # %i ", val);
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.