Как сравнить массив uint8_t со строкой в ​​C? - PullRequest
1 голос
/ 03 мая 2019

У меня есть вход, который идет через UART.

uint8_t uartRX_data[UART_RX_BUF_SIZE]="";

Мне нужно передать эти данные в функцию.И в этой функции я хочу сравнить ее с предопределенными строками, такими как:

char RESP_OK[]                  = "OK";
char RESP_ERROR[]               = "ERROR";
char RESP_FAIL[]                = "FAIL";

Какой самый простой способ сделать это?

РЕДАКТИРОВАТЬ: Моя проблема только в сравнении данных ипередача данных в функцию.

Ответы [ 2 ]

3 голосов
/ 03 мая 2019

Пока строка в uartRX_data заканчивается NULL, вы можете использовать strcmp примерно так:

if (strcmp((const char *)uartRX_data, RESP_OK) == 0)
{
  // handle OK
}
else if (strcmp((const char *)uartRX_data, RESP_ERROR) == 0)
{
  // handle ERROR
}
else if (strcmp((const char *)uartRX_data, RESP_FAIL) == 0)
{
  // handle FAIL
}
else
{
  // handle unknown response
}
1 голос
/ 03 мая 2019

Большинство преобразований между типами char, signed char, unsigned char, int8_t и uint8_t можно считать безопасными. Это типы символов и имеют различные специальные исключения, которые делают их более "защищенными", чем другие типы.

В частности, типы символов:

  • Не может быть смещено.
  • Не может содержать биты заполнения или представления прерываний.
  • Есть исключения из действующего типа / строгих правил наложения имен.
  • Всегда имеют размер 1 байт.

Это означает, что вы можете выполнять всевозможные дикие преобразования между различными типами символов. За некоторыми исключениями:

  • При переходе от неподписанного к подписанному типу данные могут не совпадать, и вы перезапишете бит знака. Это может привести к ошибкам.
  • Опасно «отбрасывать» квалификаторы const или volatile, если они присутствуют.

Поэтому можно безопасно преобразовать из uint8_t* в char* и отменить ссылку на данные как другой тип, (char*)uartRX_data. Особенно, если вы знаете, что массив uint8_t содержит допустимые 7-битные символы только с MSB, который никогда не устанавливается, и с нулевым окончанием в конце массива.

...