我正在尝试将以下结构转换为char数组,以便我可以通过串口发送它。
struct foo
{
uint16_t voltage;
char ID ;
char TempByte;
char RTCday[2];
char RTCmonth[2];
char RTCyear[2];
char RTChour[2];
char RTCmin[2];
char Sepbyte;
}dvar = { 500, 'X' , '>' , "18" , "10" , "15" , "20" , "15" , '#'};
然后我使用以下内容将其转换为char数组:
char b[sizeof(struct foo)];
memcpy(b, &dvar, sizeof(struct foo));
但是出于某种原因,我在char数组中得到了这些尾随值
0x0A 0xFF
我最初认为它是获取值,因为当我将它转换为char数组时,它实际上将它转换为字符串,所以我虽然是NULL'\ 0'
任何帮助将不胜感激。
由于
答案 0 :(得分:4)
在现代处理器上,sizeof(结构数据下载)需要在32位边界上对齐。您的数据结构大小为8个字符+ 1个短(16位)整数。编译器需要在结构大小上添加2个字符才能在分配时正确处理它。 由于您通过串行线路进行通信并确切知道要发送的内容,因此您可以指定您愿意通过串行线路发送的确切字节数:2 + / * 1 short * / + 8 (8个字节)。
答案 1 :(得分:1)
我怀疑你正在使用8位微控制器!
您可以通过打印b[sizeof(foo)]
和b[sizeof(foo)+1]
进行调试
这些将是你的两个角色。
如果你注意到,你不应该引用它们,它们超出了char数组的范围。例如n个元素数组[0 ..(n-1)](从你的结构中复制)
如果向结构中添加一个未使用的元素(或增加最终成员的大小),则可以终止char数组'\ 0' - 编译器可能想要这样做。
或者执行@Melebius显示的指针赋值。