我希望从一个微控制器到另一个微控制器逐字节发送一个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) 它需要一个空点和要发送的数据的大小。在接收端,我逐字节接收发送的数据,并从其中重新构造发送的数据。我在两个设备上都有相同的字节顺序。不幸的是,我以不同的顺序接收字节,如果
MSGSENDER_vSend(&msMessage, sizeof(msMessage))MSGSENDER_vSend(&msMessage.mu8MessageId, sizeof(msMessage.mu8MessageId))
MSGSENDER_vSend(&msMessage.mu8MessageSenderId, sizeof(msMessage.mu8MessageSenderId))
//...为什么字节以不同的顺序发送?
发布于 2014-08-20 21:57:46
根据编译器和编译标志,结构中的成员之间可能存在“空白”。如果它优化速度,则有可能尝试根据最大的成员类型对齐成员。在您的例子中,您使用的是3个1字节的成员和2个2字节的成员,并且可以在最后一个字符和第一个短字符之间插入1字节的空值,这样短字符就对齐了两个字节(因为它是2个字节)。
无论如何,您不应该发送(或存储)原始结构,因为如果使用不同的标志重新编译应用程序,它们可以更改。最安全的方法总是一个一个地发送数据成员,然后在接收端完全控制订单。
https://stackoverflow.com/questions/25402818
复制相似问题