2016-05-15 3 views
0

Я работаю над проектом, где мне нужно отправить значения 32 бит по UART в MATLAB, где мне нужно распечатать их на терминале MATLAB. Я делаю это, дробя 32 битное значение в 8-битовых значений, как так (:Разделите 32-битное значение на C++ и соедините куски в MATLAB

void Configurator::send(void) { 

    /** 
    * Split the 32 bits in chunks of 4 bytes of 8 bits 
    */ 
    union { 
     uint32_t data; 
     uint8_t bytes[4]; 
    } splitData; 

    splitData.data = 1234587; 

    for (int n : splitData.bytes) { 
     XUartPs_SendByte(STDOUT_BASEADDRESS, splitData.bytes[n]); 
    } 

} 

В MATLAB я получаю следующие 4 байта:

252 
    230 
    25 
    155 

Теперь вопрос в том, как восстановить 1234587

Правильно ли я создаю массив размером 4 как uint8_t? Я также хотел бы отметить, что я использую объединение для удобочитаемости. Если я ошибаюсь, я был бы рад услышать почему!

ответ

0

Вы можете использовать сдвиг влево для восстановления значения

uint32_t value = (byte[3]<<24) + (byte[2]<<16) + (byte[1]<<8) + (byte[0]<<0); 
0

Старайтесь избегать использования союзов для такого рода вещи. Он не является (в принципе) переносным и может вызвать неопределенное поведение. Вместо того, чтобы написать это:

void Configurator::send(void) { 

    /** 
    * Split the 32 bits in chunks of 4 bytes of 8 bits 
    */ 
    uint32_t data = 1234587; 

    for (int n = 0; n<4; n++) { 
     unsigned char octet = (data >> (n*8)) & 0xFF; 
     XUartPs_SendByte(STDOUT_BASEADDRESS, octet); 
    } 
} 

uint32_t recieveBytes(
{ 
    uint32_t result = 0; 
    for (int n = 0; n<4; n++) 
    { 
     unsigned char octet = getOctet(); 
     uint32_t octet32 = octet; 
     result != octet32 << (n*8); 
    } 
    return result; 
} 

Дело в том, что переход из байт, как это, вы избежать каких-либо проблем с байтов. Маскировка также означает, что если на одном конце есть 32-битные символы (такие платформы существуют), все это работает.

Смежные вопросы