我想从一个微控制器到另一个微控制器逐字节发送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和要发送的数据的大小。在接收器处,我逐字节地接收发送的数据,并从中重建发送的数据。我在两个设备上都有相同的字节顺序。 不幸的是,如果我
,我会以不同的顺序收到字节MSGSENDER_vSend(&msMessage, sizeof(msMessage))
MSGSENDER_vSend(&msMessage.mu8MessageId, sizeof(msMessage.mu8MessageId))
MSGSENDER_vSend(&msMessage.mu8MessageSenderId, sizeof(msMessage.mu8MessageSenderId))
//...
为什么以不同的顺序发送字节?
答案 0 :(得分:0)
根据编译器和编译标志,可能存在&#34;间隙&#34;结构中的成员之间。如果它优化了速度,它有可能会尝试根据最大的成员类型对齐成员。 在您的情况下,您使用3个1字节成员和2个2字节成员,并且可以在最后一个char和第一个short之间插入1个字节的void,因此short由两个对齐(因为它的2个字节)< / p>
无论如何,您不应该发送(或存储)原始结构,因为如果您使用不同的标志重新编译应用程序,它们可以更改。最安全的方法是始终逐个发送数据成员,然后您可以完全控制接收方的订单