Преобразование char[] в uint32_t

Здравствуйте. Уже несколько дней бьюсь с возникшей проблемой.
Имеется программа, которая по serial получает число из 4 байт в формате “cb f4 39 26” и записывает их в char массив.
Каким образом можно из этого массива собрать uint32_t число и положить в соответствующую переменную?
Моих знаний хватило только на следующий код, но к сожалению и он не совсем работоспособен, так как к переменной ‘a’ во время преобразования приклеиваются лишние символы ‘ff’.

char rcvd[4];
int i = 0;
void setup() {
Serial.begin(9600);
}


void loop() {
  while (Serial.available()) {
    char inChar = (char)Serial.read();
    rcvd[i] = inChar;
    i++;
    }
  i = 0;
  Serial.println(rcvd);
String a = "";
  a += String(rcvd[0], HEX);
  a += String(rcvd[1], HEX);
  a += String(rcvd[2], HEX);
  a += String(rcvd[3], HEX);

   Serial.print("a = ");
   Serial.println(a);
    
  char text_buff[] = "FFFFFFFF";  
  a.toCharArray(text_buff, 8);
    Serial.print("text_buff = ");
    Serial.println(text_buff); 
  uint32_t SUM = 0;
   
   sscanf(text_buff, "%lx", &SUM);
    Serial.print("SUM = ");
    Serial.println(SUM);  
  delay(3000);

}

Каким образом можно более корректно произвести такое преобразование?

Что значит, приклеиваются? Где протокол? Чего там печатается-то в монитор порта?

https://cplusplus.com/reference/cstdlib/strtoul/

Вот скрин из монитора порта в hex и dec


отправил hex ‘cb f4 39 26’ в переменную rcvd она записалась корректно, а в переменной ‘a’ она уже выглядит как ‘ffcbfff43926’

а ничего, что буфер инициализирован не нулями?

Бросьте ваши преобразования через String, это все бред.
Вот, держите, одна строка

char rcvd[4];
uint32_t a;
memcpy((uint8_t*)a, (uint8_t*)rcvd, 4);

У вас эти 4 байта - и есть готовое значение uint32 в бинарном виде. Не надо ничего преобразовывать, всего лишь байты скопировать в переменную соответствующего типа

Можно не выпендриваться, а показать нормальный символьный вывод? Просто копипасту текста из монитора порта? Только полную, всё, что печатается.

Кроме того, если Вы хотите нормально печатать, так печатайте правильно. В строке №15 Вы печатать строку у которой в конце нет ‘\0’'. Что Вы надеетесь при этом увидеть?

И ещё что конкретно Вы передаёте через последовательный порт? Кто передаёт? Руками из монитора порта набираете? Или программа какая передаёт? Можно ли посмотреть на ту программу?

Огромное спасибо, это именно то, что я искал. Позже проверю и отпишусь

К сожалению не получилось, добавил код в программу, но сразу после вывода в serial строки rcvd программа зависает

Спойлер
char rcvd[4] = "";  
uint32_t a = 0;
int i = 0;
void setup() {
Serial.begin(9600);
}
void loop() {

  while (Serial.available()) {
    char inChar = (char)Serial.read();
    rcvd[i] = inChar;
    i++;
    }
  i = 0;  
  if (rcvd[1] != NULL){
    Serial.println(rcvd);
memcpy((uint8_t*)a, (uint8_t*)rcvd, 4);
Serial.print("a = ");
Serial.println(a);
rcvd[1] = NULL;
}
  delay(3000);
}

Хотел Вам ответить. В сообщении выше описал проблему

если бы она была одна

  • строка 1 - если вы продолжаете считать это массивом символов - длина его должна быть на один больше, вам уже сказали об этом
  • строка 9 - вы читаете байты из Сериал, не проверяя сколько их. У вас массив всего 4 байта, а вы может туда 104 прочитали…
  • строка 15 - что за бессмысленное условие? почему именно второй элемент не должен быть NULL?
  • строка 16 -вы приняли данные как массив байт. массивы байт так не печатают. Создайте цикл, пройдите по массиву и печатайте байт за байтом в Хекс
  • строка 20 - такой же бред как строка 15

В целом, учите С++. Иначе даже наличие прямого ответа на ваш вопрос не поможет вам написать нормальный код.