你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

C语言的结构体和共用体在单片机中的妙用

[复制链接]
gaosmile 发布时间:2020-9-7 15:30
C语言的结构体和共用体,往往在单片机应用开发中被忽视。如果能够用起来,不仅能够极大的提高单片机的运行效率,还可能解决一些看起来无法解决的问题。
现在,给大家举一个例子:单片机串口需要接收并处理大量数据的情况。
示例:单片机甲要与某个设备乙通信,它们采用串口连接,设备乙会给单片机甲发送串口数据,数据一共有46个字节,其中前8个字节表示命令,后8个字节表示设备信息,中间30个字节表示有效数据。
普通的程序代码,会进行如下变量定义:

  1. unsigned char rec_buf[46]; // 定义接收缓存
  2. unsigned char command[8]; // 定义命令变量
  3. unsigned char valid_data[30]; // 定义有效数据变量
  4. unsigned char device_info[8]; // 定义器件信息变量
复制代码

在串口中断函数中,使用rec_buf接收串口数据。此处省略接收代码,自行脑补。
接收完毕后,再使用如下代码把对应的变量取出来。

  1. //取出命令
  2. for(i=0;i<8;i++)
  3. {
  4.   command[i]=rec_buf[i];
  5. }
  6. //取出有效数据
  7. for(i=8;i<38;i++)
  8. {
  9.   valid_data[i-8]=rec_buf[i];
  10. }
  11. //取出器件信息
  12. for(i=38;i<46;i++)
  13. {
  14.   device_info[i-38]=rec_buf[i];
  15. }
复制代码

取出来之后,就可以在程序中使用了,比如,判断接收到的是什么命令,如下代码所示:


  1. if(command[0]==0x88) // 如果是修改参数命令
  2. {
  3.   if(command[1]==0x33)// 如果修改的是IP地址参数
  4.   {
  5.     // 就怎么怎么样...
  6.   }
  7.   ...
  8. }
复制代码

好!上面是普通的用法,接下来,我们使用结构体和共用体!


  1. union
  2. {
  3.   rec_buf[46];
  4.   struct
  5.   {
  6.     unsigned char command[8];
  7.     unsigned char valid_data[30];
  8.     unsigned char device_info[8];
  9.   }ComInfo;
  10. }D_buf;
复制代码

上面代码中,我们使用了共用体和结构体的方法定义了串口接收缓存和串口命令、有效数据和器件信息变量。
当我们在串口中断中接收完数据后。就可以直接使用这些变量了。例如:


  1. if(D_buf.ComInfo.command[0]==0x88) // 如果是修改参数命令
  2. {
  3.   if(D_buf.ComInfo.command[1]==0x33)// 如果修改的是IP地址参数
  4.   {
  5.     // 就怎么怎么样...
  6.   }
  7.   ...
  8. }
复制代码

下面,我解释一下代码。
共用体的特点:内部的变量使用同一个首地址。在我们定义的共用体里面,有两个变量,一个是rec_buf,一个是ComInfo,所以,它俩的内存首地址是相同的。
结构体的特点:内部的变量地址自增。在我们定义的结构体ComInfo中,command变量、valid_data变量、device_info变量使用同一片内存空间,地址连续。
基于以上共用体和结构体的特点,当我们接收完rec_buf以后,其实,数据就已经在结构体中的这3个变量中了,直接用就可以,省去了前面示例中“取出来”的环节。

收藏 1 评论1 发布时间:2020-9-7 15:30

举报

1个回答
louzhulz 回答时间:2020-9-11 14:07:45
很好,又学到一招。牛

所属标签

STM32团队

意法半导体微控制器和微处理器拥有广泛的产品线,包含低成本的8位单片机和基于ARM® Cortex®-M0、M0+、M3、M4、M33、M7及A7内核并具备丰富外设选择的32位微控制器及微处理器


最新内容

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
微信公众号二维码 微信公众号
手机版二维码 手机版