【发布时间】:2018-07-19 07:04:58
【问题描述】:
我正在接收字节缓冲区数组并尝试将其复制到结构中:
我的结构是:
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 个字节但有填充?在结构中?)我该如何解决这个问题?
【问题讨论】:
-
不要使用 memcpy。您需要解析字节流,单独“理解”该值并将它们显式且单独地写入结构的成员。对填充、大小、字节顺序等的任何假设都会使您的程序不可移植,并且将来容易失败。
-
可能有填充它是编译器特定的。我担心类型的混合,例如
blockTX.str_buf = "eee789";不是复制字符串的方式,您应该使用strcpy。 -
@cdarke 好吧,抱歉,blockTX 代码不是 c# 中的 c 代码。它实际上是:blockTX.str_buf = Encoding.ASCII.GetBytes("eee789");但我把它条带化只是为了显示数据而不是代码。
-
更长,更慢是的。但长慢正确优于短快错误或短快不可重用。同样需要更改代码以了解新的消息结构。
-
@AndrewHenle 好点。让我们在“即使再慢一点”上妥协。 ;-)
标签: c structure microcontroller memcpy