3328浏览
查看: 3328|回复: 2

[入门] 共用体(union)学习笔记

[复制链接]
本帖最后由 LALALA 于 2019-7-31 22:16 编辑

最近做“课题”要用EEPROM,单是EEPROM还好,但是对EEPROM操作只能存入字节(byte)型的变量,但是我需要的是整数(int)型变量,发现大家一般用共用体把一个int分成两个byte存储,但是union是个什么玩应,杜洋老师也没讲过啊?我查了各种帖子、博客,再加上自己瞎鸡儿乱试,终于搞明白了,在这记录一下,也算是分享了,有不足的地方,欢迎大家批评指正。


说,共用体还有一兄弟叫结构(struct),哥俩的区别在于共用体是几个变量共用一块存储空间,因而可以用于实现拆分数据的功能。
定义共用体
1.  union test                //定义test联合体   
2.  {     
3.    int office;             //整型成员office   
4.    byte teacher[2];        //字节数组成员teacher   
5.  }a,b;                     //定义同时说明a,b为test类型   
6.                        //a,b变量的长度应等于test的成员中最长的长度,   
7.                        //即等于teacher数组的长度,共2个字节。  


要表示共用体可以用
1.  a.office   
2.  a.teacher[0]  
3.  a.teacher[1]  


如上,a.teacher[0]和a.teacher[1]其实就是拆分后的a.office
如果我们让
1.  a.office = 0xff00;      //即1111 1111 0000 0000   


1.  a.teacher[0] == 0000 0000   
2.  a.teacher[1] == 1111 1111   


这样就实现了拆分数据的目的
至于复原数据,就是这个操作的反过程
完整代码如下(适用于Arduino

1.  #include <EEPROM.h>  
2.   
3.  union data   
4.  {  
5.    int a;  
6.    byte b[2];  
7.  } distance;  
8.   
9.  void setup()   
10. {  
11.   Serial.begin(9600);  
12.   
13.   //清空数据(每个地址都写0)  
14.   for (int i = 0; i < 512; i++)  
15.   {  
16.      EEPROM.write(i, 0);   
17.   }  
18.     
19.   //数据拆分  
20.   distance.a = 32000;  
21.   for(int i = 0; i < 2; i++)   
22.   {  
23.     EEPROM.write(i,distance.b);  
24.   }  
25.   
26. }  
27.   
28. void loop()  
29. {  
30.   //数据还原  
31.   for(int i = 0; i < 2; i++)  
32.   {  
33.     distance.b = EEPROM.read(i);  
34.   }  
35.   Serial.println(distance.a);  
36.   delay(1000);  
37. }  



gada888  版主

发表于 2019-8-1 09:47:43

很好的分享
回复

使用道具 举报

LALALA  见习技师
 楼主|

发表于 2019-7-31 22:17:55

这。。。。自己搞的代码块翻车了。。。。
代码也可以在这里查看/下载
https://gitee.com/TobbyLALALA/study/tree/master
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

为本项目制作心愿单
购买心愿单
心愿单 编辑
[[wsData.name]]

硬件清单

  • [[d.name]]
btnicon
我也要做!
点击进入购买页面
上海智位机器人股份有限公司 沪ICP备09038501号-4

© 2013-2024 Comsenz Inc. Powered by Discuz! X3.4 Licensed

mail