Как преобразовать uint8_t из uart_read_bytes в символ или что-то, что можно добавить в объект cJSON?
Здесь я читаю из 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) или даже для символа (строкового типа)), затем я могу добавить его в объект cJSON и отправить его.
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);
}
Если строка:
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] ;
в зависимости от порядка байтов данных?