ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
【73.1 结构体数据的传输存储和还原。】 结构体本质是一个数组,数组内可能包含了许多不同数据长度类型的成员,当整个结构体数据需要存储或者传输(通信)给另外一个单片机时,这时候有两种选择,一种是一个成员一个成员的挨个处理,这种“以成员为单位”的处理方式比较繁琐麻烦,另外一种是把整个结构体变量当作一个“以字节为单位”的普通数组来处理,但是有两个关键的问题来了,第一个问题是如何把结构体“拆分”成“以字节为单位”来进行搬动数据,第二个问题是假如我们把整个结构体数据以“字节为单位”的方式“整体打包”传递给另外一个单片机,当这个接收方的单片机接收到我们这一组数据后,如何把这“一包”以字节为单位的数组再“还原”成相同的结构体变量,以便在程序处理中也能直接按“结构体的方式”来处理某个具体的成员。其实,这两个问题都涉及到“指针的强制转换”。具体讲解的例子,请直接阅读下面73.2段落的源代码例子和注释。 【73.2 例程练习和分析。】 现在编写一个练习程序,把一个结构体变量“以字节的方式”存储到另外一个普通数组里,然后再把这个“以字节为单位”的普通数组“还原”成“结构体的方式”,以便直接操作内部某个具体的成员。 /\*---C语言学习区域的开始。-----------------------------------------------\*/ struct StructMould\_1 { unsigned char u8Data\_A; unsigned long u32Data\_B; unsigned int u16Data\_C; }; struct StructMould\_1 GtMould\_1; //“生成”一个变量。 unsigned char Gu8Buffer\[sizeof(GtMould\_1)\]; //定义一个内存跟结构体变量大小一样的普通数组 unsigned char \*pu8; //定义一个把结构体变量“拆分”成“以字节为单位”的指针 struct StructMould\_1 \*ptStruct; //定义一个结构体指针,用于“还原”普通数组为“结构体” unsigned int i; //定义一个用于for循环的变量 void main() //主函数 { //先把该结构体变量内部具体成员分别以“成员的方式”初始化为5,6,7 GtMould\_1.u8Data\_A=5; GtMould\_1.u32Data\_B=6; GtMould\_1.u16Data\_C=7; pu8=(unsigned char \*)&GtMould\_1; //把结构体变量强制转换成“以字节为单位”的指针 for(i=0;i<sizeof(GtMould\_1);i++) { Gu8Buffer\[i\]=pu8\[i\]; //把结构体变量以字节的方式搬运并且存储到普通数组里。 } ptStruct=(struct StructMould\_1 \*)&Gu8Buffer\[0\]; //再把普通数组强制“还原”成结构体指针 ptStruct->u8Data\_A=ptStruct->u8Data\_A+1; //该变量从5自加1后变成6。 ptStruct->u32Data\_B=ptStruct->u32Data\_B+1; //该变量从6自加1后变成7。 ptStruct->u16Data\_C=ptStruct->u16Data\_C+1; //该变量从7自加1后变成8。 View(ptStruct->u8Data\_A); //在电脑端观察结构体成员u8Data\_A的数值。 View(ptStruct->u32Data\_B); //在电脑端观察结构体成员u32Data\_B的数值。 View(ptStruct->u16Data\_C); //在电脑端观察结构体成员u16Data\_C的数值。 while(1) { } } /\*---C语言学习区域的结束。-----------------------------------------------\*/ 在电脑串口助手软件上观察到的程序执行现象如下: 开始... 第1个数 十进制:6 十六进制:6 二进制:110 第2个数 十进制:7 十六进制:7 二进制:111 第3个数 十进制:8 十六进制:8 二进制:1000 分析: 结构体成员u8Data\_A的数值是6。 结构体成员u32Data\_B的数值是7。 结构体成员u16Data\_C的数值是8。 【73.3 如何在单片机上练习本章节C语言程序?】 直接复制前面章节中第十一节的模板程序,练习代码时只需要更改“C语言学习区域”的代码就可以了,其它部分的代码不要动。编译后,把程序下载进带串口的51学习板,通过电脑端的串口助手软件就可以观察到不同的变量数值,详细方法请看第十一节内容。