Шестнадцатеричный массив символов 2 на 2 символа для uint8_t

Я делаю программу для микроконтроллера (mbed LPC1768) и имею несколько проблем для декодирования последовательного ввода в uint8_t.

Я получаю char ackBuffer[20]; заполнен вводом с внешнего устройства.
Что мы получаем, например: F040A34B6785121\r

Я хочу получить массив uint8_t, где каждое число обозначается шестнадцатеричным значением из 2 символов. Символ F показывает, что сообщение с внешнего устройства запущено, а возврат каретки является концом каждого сообщения.

Итак, что я хочу в массиве uint8_t:

0x04
0x0A
0x34
...

Чтобы сделать его еще сложнее, ackBuffer может быть меньшего размера, например, только F04004A\r (если это легко исправить, то это очень хорошо, но я могу обойти эту проблему самостоятельно.

Спасибо!

-1

Решение

Итак, я предполагаю, что ackMessage должен начинаться с 'F' и заканчивается '\r', И я даже предполагаю, что, поскольку вы работаете на микроконтроллере, следует избегать всего, что делает больше, чем требуется (например, библиотечные функции). Учитывая, что вам просто нужно перебрать буфер:

uint8_t charToHex(unsigned char value)
{
if (value >= '0' && value <= '9') return value - '0';
else if (value >= 'A' && value <= 'F') return value - 'A' + 10;
else if (value >= 'a' && value <= 'f') return value - 'a' + 10;
assert(false);
}

#define BUFFER_SIZE (20)

int main(void)
{
char ackBuffer[BUFFER_SIZE] = "F12345890AB\r";
uint8_t result[(BUFFER_SIZE-2)/2]; // at most 9 bytes since it's 20 - 2 / 2

char* ptr = ackBuffer;

assert(*ptr == 'F');
++ptr;

int count = 0;
while(*ptr != '\r')
{
uint8_t value = charToHex(*ptr) << 4 | charToHex(*(ptr+1));
result[count++] = value;
ptr += 2;
}

int i;
for (i = 0; i < count; ++i)
printf("%x\n", result[i]);

return 0;
}

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

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]