簡體   English   中英

如何將uint8_t從uart_read_bytes轉換為char或可以添加到cJSON對象的內容?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM