Как преобразовать uint8_t из uart_read_bytes в символ или что-то, что можно добавить в объект cJSON? - PullRequest
0 голосов
/ 31 декабря 2018

Здесь я читаю из UART, который связывается с другим устройством, которое отправляет ему байты.Если я получаю целочисленное значение в 3 байта, как лучше преобразовать его во что-то, что я могу отправить с помощью cJSON.Я могу получить значение и перебрать его, но как только я помещу его в массив символов, я больше не могу видеть значение.Мысли?

{
  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 и отправить его.

Ответы [ 2 ]

0 голосов
/ 04 января 2019

Итак, похоже, что для моей ситуации я конвертирую отдельные байты, считанные из 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);
} 
0 голосов
/ 01 января 2019

Если строка:

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] ;

в зависимости отпорядок байтов данных?

...