C ++:成员发送struct

时间:2014-08-20 10:50:17

标签: c++ memory structure member

我想从一个微控制器到另一个微控制器逐字节发送struct sMessage:

typedef struct {
    unsigned char mu8MessageId; 
    unsigned char mu8MessageSenderId; 
    unsigned char mu8MessageReceiverId; 
    unsigned short mu16MessageSizePayload; 
    unsigned short mu16MessageSizeTotal;
} sMessage;

sMessage msMessage;

因此我使用一个简单的函数

MSGSENDER_vSend(void* pvMessage, unsigned short u16Size) 

采用void poiner和要发送的数据的大小。在接收器处,我逐字节地接收发送的数据,并从中重建发送的数据。我在两个设备上都有相同的字节顺序。 不幸的是,如果我

,我会以不同的顺序收到字节
  • 使用struct msMessage调用此函数一次,并将其大小作为参数(字节顺序似乎正确)
MSGSENDER_vSend(&msMessage, sizeof(msMessage))
  • 为结构的每个成员调用此函数(字节顺序不正确)
MSGSENDER_vSend(&msMessage.mu8MessageId, sizeof(msMessage.mu8MessageId))
MSGSENDER_vSend(&msMessage.mu8MessageSenderId, sizeof(msMessage.mu8MessageSenderId))
//...

为什么以不同的顺序发送字节?

1 个答案:

答案 0 :(得分:0)

根据编译器和编译标志,可能存在&#34;间隙&#34;结构中的成员之间。如果它优化了速度,它有可能会尝试根据最大的成员类型对齐成员。 在您的情况下,您使用3个1字节成员和2个2字节成员,并且可以在最后一个char和第一个short之间插入1个字节的void,因此short由两个对齐(因为它的2个字节)< / p>

无论如何,您不应该发送(或存储)原始结构,因为如果您使用不同的标志重新编译应用程序,它们可以更改。最安全的方法是始终逐个发送数据成员,然后您可以完全控制接收方的订单