2015-10-20 37 views
5

我想将下面的结构转换为char数组,以便通过串行端口发送它。使用memcpy将结构转换为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 b[sizeof(struct foo)]; 
memcpy(b, &dvar, sizeof(struct foo)); 

但是出于某种原因

0x0A 0xFF 

我最初以为是我的char数组中获得这些尾随值得到的值,因为当我把它转换为一个字符数组它有效地将它转换为一个字符串,所以我虽然是NULL'\'0'

任何帮助将不胜感激。

感谢

+4

我看不到结构'datadownload'在哪里,它的大小是多少 – Gopi

+1

“尾随值”是什么意思?你如何检查数组的内容?你在编程C或C++吗?语义可能不同。在一个不相关的说明中,你有没有使用联盟? –

+2

http://stackoverflow.com/questions/119123/why-isnt-sizeof-for-a-struct-equal-to-the-sum-of-sizeof-of-each-member – Lundin

回答

1

我有一个鬼鬼祟祟的怀疑,你正在使用一个8位微控制器! 您可以通过打印b[sizeof(foo)]b[sizeof(foo)+1] 进行调试这些将是您的两个字符。 如果你注意到了,你不应该引用它们,它们超出了char数组的范围。例如n元素数组[0 ..(n-1)](从你的结构体复制而来)

如果向结构中添加未使用的元素(或增加最终成员的大小) \ 0'编译器可能想要这样做。

或者@Melebius显示的指针赋值。

4

在现代的处理器的sizeof(结构数据下载)需要在32位边界对齐。您的数据结构大小为8个字符+ 1个短(16位)整数。编译器需要将2个字符添加到结构的大小,以便在分配时能够正确处理它。 由于您是通过串行线路进行通信并确切知道您要发送的内容,因此您可以指定您愿意通过串行线路发送的确切字节数:2 +/* 1 short */+ 8(8字节)。