当前位置:首页 > 单片机学习笔记 > 正文

使用共用体在EEPROM中存储double和float类型的数据

我们知道结构体(Struct)是一种构造类型或复杂类型,它可以包含多个类型不同的成员。在C语言中,还有另外一种和结构体非常类似的语法,叫做共用体(Union),它的定义格式为:

union 共用体名{
成员列表
};

共用体有时也被称为联合或者联合体,这也是 Union 这个单词的本意。

结构体和共用体的区别在于:结构体的各个成员会占用不同的内存,互相之间没有影响;而共用体的所有成员占用同一段内存,修改一个成员会影响其余所有成员。

结构体占用的内存大于等于所有成员占用的内存的总和(成员之间可能会存在缝隙),共用体占用的内存等于最长的成员占用的内存。共用体使用了内存覆盖技术,同一时刻只能保存一个成员的值,如果对新的成员赋值,就会把原来成员的值覆盖掉。

有的时候我们需要将float或者double类型的数据存到EEPROM中以备下次利用,比如制作电子称存储皮重等信息时。
但是EEPROM仅仅能以8bit一位存储。在网上查了一下,貌似使用共用体的方法很火,于是写了个代码,当仅仅要存取float类型时,只需要把v前面的double改为float,把循环和声明dchar中的8改为4即可(转自极客工坊作者:shenhaiyu)。

#include <EEPROM.h>

union data {
double v;
unsigned char dchar[8];
} dvalue;

void setup() {
Serial.begin(9600);

//数据拆分
dvalue.v = 169600.00;
unsigned char *dpointer;
dpointer = dvalue.dchar;

for(int i = 0; i < 8; i++) {
EEPROM.write(i,*dpointer);
dpointer++;
}
}

void loop()
{
//数据还原
for(int i = 0; i < 8; i++) dvalue.dchar[i] = EEPROM.read(i);
Serial.println(dvalue.v);
delay(1000);
}

标签:
上一篇: 下一篇:

报歉!评论已关闭。