Лучше посылайте и принимайте в бинарном виде - будет быстрее и проще.
Объявите как union переменную типа long и массив типа char:
union { unsigned long mass; char bytes[4]; } data;
Тогда они по памяти будут тождественными.
Потом кладете в long-переменную число, а из ее char-дубля отправляете по порядку 4 байта по UART.
data.mass = 4294967294;
for(i=0; i<4; i++) { while (!(USART1->SR & USART_SR_TXE)) USART1->DR=data.bytes[i]; }
А когда принимать будете, делайте всё наоборот - принимайте в data.bytes[i], а числовой результат получите в data.mass.
---
А можно соорудить то же самое, сформировав на log-переменную указатель типа char:
unsigned long mass = 4294967294;
char *pbytes = (char*)&mass;
for(i=0; i<4; i++) { while (!(USART1->SR & USART_SR_TXE)) USART1->DR=pbytes[i]; }
Тогда через этот указатель можно таскать байты из long-переменной или, наоборот, в нее запихивать.
А если не боитесь сложных выражений

, то можно таскать байты из переменной явным переопределением ее типа, не создавая для этого указатель:
unsigned long mass = 4294967294;
for(i=0; i<4; i++) { while (!(USART1->SR & USART_SR_TXE)) USART1->DR=((char*)&mass)[i]; }