我正在接收字节缓冲区数组,并尝试将其复制到结构中:
我的结构是:
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个字节但有填充?结构中?)不行吗?
答案 0 :(得分:4)
传输数据需要考虑填充,大小,字节序等,因此您需要正确生成和解析字节流。您可以使用googloe protobuf之类的东西来序列化和反序列化您可能稳定舒适的数据。
但是,如果必须,您可以为结构赋予packed属性。这消除了所有填充和对齐限制。这样一来,您memcpy()
的结构就无需填充,但代价是访问结构本身的成员的速度较慢。这样做只有两个很好的理由: