首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C++:以成员的形式发送一个结构化的

C++:以成员的形式发送一个结构化的
EN

Stack Overflow用户
提问于 2014-08-20 10:50:16
回答 1查看 75关注 0票数 0

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

代码语言:javascript
复制
typedef struct {
    unsigned char mu8MessageId; 
    unsigned char mu8MessageSenderId; 
    unsigned char mu8MessageReceiverId; 
    unsigned short mu16MessageSizePayload; 
    unsigned short mu16MessageSizeTotal;
} sMessage;

sMessage msMessage;

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

代码语言:javascript
复制
MSGSENDER_vSend(void* pvMessage, unsigned short u16Size) 

它需要一个空点和要发送的数据的大小。在接收端,我逐字节接收发送的数据,并从其中重新构造发送的数据。我在两个设备上都有相同的字节顺序。不幸的是,我以不同的顺序接收字节,如果

  • 使用结构msMessage及其大小作为参数调用此函数一次(字节顺序似乎正确)

代码语言:javascript
复制
MSGSENDER_vSend(&msMessage, sizeof(msMessage))
  • 为结构的每个成员调用此函数(字节顺序不正确)

代码语言:javascript
复制
MSGSENDER_vSend(&msMessage.mu8MessageId, sizeof(msMessage.mu8MessageId))
MSGSENDER_vSend(&msMessage.mu8MessageSenderId, sizeof(msMessage.mu8MessageSenderId))
//...

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

EN

回答 1

Stack Overflow用户

发布于 2014-08-20 21:57:46

根据编译器和编译标志,结构中的成员之间可能存在“空白”。如果它优化速度,则有可能尝试根据最大的成员类型对齐成员。在您的例子中,您使用的是3个1字节的成员和2个2字节的成员,并且可以在最后一个字符和第一个短字符之间插入1字节的空值,这样短字符就对齐了两个字节(因为它是2个字节)。

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25402818

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档