2016-05-15 4 views
0

私はUARTで32ビットの値をMATLABに送信しなければならないプロジェクトに取り組んでいます。私は、次の4バイト受け取るMATLABでC++で32ビットの値を分割し、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]); 
    } 

} 

を:私はそうのような8ビットの値(に32ビット値を分割することによってこれを行う

252 
    230 
    25 
    155 

することは今の質問は、私が復元んか、あります1234587

私はまた、私は読みやすくするために労働組合を使用していることに注意したいと思います。私はそれが間違ってやっている場合は、私は聞いて幸せだろう?uint8_tとして大きさ4の配列を作成して修正アムなぜ!

答えて

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ビットの文字を持つ場合(そのようなプラットフォームが存在する場合)、それはすべてとにかく動作することを意味します。

関連する問題