c struct和memcpy(字节数组)

时间:2018-07-19 07:04:59

标签: c structure microcontroller memcpy

我正在接收字节缓冲区数组,并尝试将其复制到结构中:

我的结构是:

typedef struct mydata_block
{
    uint8_t cmd;
    uint32_t param;
    char str_buf[10];
    uint32_t crc32;
} mydata_t;

首先,发送数据的程序如下:

  

blockTX.cmd = 2

     

blockTX.str_buf =“ eee789”

     

blockTX.param = 1001

     

blockTX.crc32 = 3494074521

-

  

02-00-00-00-E9-03-00-00-65-65-65-37-38-39-00-00-00-00-00-00-99-58-43-D0

在收到数据后,使用以下memcpy代码将数据复制到结构中:

    memcpy((uint8_t *)&blockRX,(uint8_t *)usbd_cdc_buffer,sizeof(blockRX));

一切看起来都很好,但是cmd(它的1个字节但有填充?结构中?)不行吗?

1 个答案:

答案 0 :(得分:4)

传输数据需要考虑填充,大小,字节序等,因此您需要正确生成和解析字节流。您可以使用googloe protobuf之类的东西来序列化和反序列化您可能稳定舒适的数据。

但是,如果必须,您可以为结构赋予packed属性。这消除了所有填充和对齐限制。这样一来,您memcpy()的结构就无需填充,但代价是访问结构本身的成员的速度较慢。这样做只有两个很好的理由:

  1. 结构的对齐方式和填充方式取决于控制之外的力(必须与硬件或第三方软件匹配)。
  2. 作为将数据转换为主机格式的中间步骤。