结构体在C程序中的妙用之一

结构体是一种数据的归类方式,相比数组或变量更具有整体全面性,例如一个数组只可以放一些按照元素顺序存放的单元变量,tab[i]={x,x,x,x,x......},i有多大,数组内元素就有多少.那么我们这时候如果我们用这个数组来接收串口接收信息,信息的格式是: 数据头>数据长度>数据区>数据校验>数据尾.

假设数据区为 <身高-体重-性别-年龄-学历>

那么我们用数组接收时,提取数据时就需要计算出数据格式中每个单元所对应的位置,即数组中第i个元素对应的内容.这样显然是很麻烦的,效率很低.这就相当于先织了一个大网,捕捉到一网鱼,还得过下称,才能按照重量分类开来一样.

那么如果我们能提前根据接收的数据的格式来做一个容器,直接把接收的数据复制到这个容器内,岂不是省了好大劲,,有个好东西,这就是结构体.

我们按照接收数据的格式顺序定义一个结构体如下:

typedef struct

{

     u8    head;        //数据头

     u16   dataLen;      //数据长度值

     u8    height;        //身高

     u8    weight;        //体重

     u8    sex;           //性别

     u8    age;          //年龄

     u8    education;     //学历

     u8    checksum;      //校验和

     u8    endmark;       //结束字节

} RecData;

RecData  userData;

结构体已经定义好了,接下来我们就将串口接收的数据复制到这个结构体 userData里面.

定义串口接收的缓冲数组及接收最大长度.

U8 serRec[len];//串口接收数据

U8  len=100; //按照实际接收范围定义

 

我这里使用的是stm32单片机,串口具有空闲中断功能,当检测到串口收到一帧数据后,会进入中断置位,此时我们将进行数据的复制,如下:

memcpy(&userData,&serRec,len ); //内存复制 这里的len是指串口接收到的实际长度

这就将串口数据完整的复制到userData中了,而且是对号入座的, ,stm32单片机是32位单片机,结构体中的变量存储时不是按照一字节对齐存储的,即默认每个存储单元分配是4个字节,u8类型只占一字节这种默认也占了四个字节,显然空了3个字节,那么整个结构体的容量就不是结构体内所有变量的实际类型所占的大小之和.我们要做的就是让结构体内的变量可以以一字节为最小单位对齐,即各个变量紧密的连在一起在内存中,这就需要字节对齐的预处理指令:

//keil 1字节对齐

#pragma pack(push,1)

typedef struct

{

     u8    head;        //数据头

     u16   dataLen;      //数据长度值

     u8    height;        //身高

     u8    weight;        //体重

     u8    sex;           //性别

     u8    age;          //年龄

     u8    education;     //学历

     u8    checksum;      //校验和

     u8    endmark;       //结束字节

} RecData; 

#pragma pack(pop)//恢复keil原来的数据对齐方式

用这条预处理指令将结构体声明在其中即可,代表结构体中变量会在内存中按照一字节对齐的方式存储.

至此,

  userData.head

  userData.dataLen   

  userData.height

.........

这些都已对号入座的数据就可以直接使用了.

  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

>行者<

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值