共用体(union)学习笔记

2019-07-311.1万
AI 快速预览详细 收起
本文介绍了如何使用共用体(union)在Arduino中将int型变量拆分为byte存储,以便写入EEPROM。首先定义了一个包含int和byte数组的共用体,然后通过赋值操作将int型变量拆分为两个byte,并写入EEPROM。最后通过读取EEPROM中的byte数据并重新组合为int型变量,实现了数据的复原。完整代码示例展示了整个过程。


最近做“课题”要用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. }  



创作许可协议

本项目采用 None(不开放任何权利,保留所有权利) 进行许可。

评论(2)
gada888
gada888
很好的分享
LALALA
LALALA
作者
这。。。。自己搞的代码块翻车了。。。。
代码也可以在这里查看/下载
https://gitee.com/TobbyLALALA/study/tree/master
- 没有更多了 -