查看: 28414|回复: 33

使用共用体存储各类型数据到EEPROM

[复制链接]
  • TA的每日心情
    郁闷
    2018-12-6 22:21
  • 签到天数: 48 天

    [LV.5]常住居民I

    发表于 2013-2-27 02:06 | 显示全部楼层 |阅读模式
    本帖最后由 奈何col 于 2013-8-8 19:20 编辑

    你可能发现了,使用Arduino提供的EEPROM API,只能将字节型的数据的存入EEPROM。如果要存储字节以外的数据类型,又需要怎么做呢?

    一个float类型的数据,需要占用4个字节的存储空间。因此我们可以把一个float拆分为4个字节,然后逐字节的写入EEPROM,来达到保存float数据的目的。
    这里我们使用共用体,把float数据拆分为4个字节。
    共用体:几个不同的变量共同占用一段内存的结构,在C语言中,被称作共用体类型结构,简称共用体。
    首先定义一个名为data的共用体结构,共用体中有两个类型不同的成员变量:
      
    union data
      
    {
      
       float a;
      
       byte b[4];
      
    };
      
    再申明一个data类型的变量col:
      
    data col;
      
    现在你可以通过col.a访问这个共用体中的float类型成员a,通过col.b访问这个共用体中的byte类型成员b。col.a和col.b共同占用四个字节的地址。给col.a赋值后,通过col.b即可拆分float的目的。

    这里我们提供一个将float类型存入EEPROM的例程。

    kittenblock中小学创客名师推荐的图形化编程软件

    /*
    OpenJumper Examples 
    写入float类型到EEPROM
    奈何col  2013.2.2
    www.openjumper.com
    */
    
    #include <EEPROM.h>
    union data
    {
      float a;
      byte b[4];
    };
    data col;
    int addr = 0;
    int led = 13;
    
    void setup()
    {
      col.a=987.65;
      for(int i=0;i<4;i++)
      EEPROM.write(i, col.b);
      pinMode(led, OUTPUT);     
    }
    
    void loop()
    {
      //LED闪烁,提示任务已完成
      digitalWrite(led, HIGH);
      delay(1000);
      digitalWrite(led, LOW); 
      delay(1000);    
    }
    


    读出储存在EEPROM中的float类型数据思路和写入时相同,完整代码如下:

    kittenblock中小学创客名师推荐的图形化编程软件

    /*
    OpenJumper Examples 
    从EEPROM读出float类型
    奈何col  2013.2.2
    www.openjumper.com
    */
    
    #include <EEPROM.h>
    union data
    {
      float a;
      byte b[4];
    };
    data col;
    int addr = 0;
    int led = 13;
    
    void setup()
    {
      for(int i=0;i<4;i++)
      col.b=EEPROM.read(i);
      Serial.begin(9600);     
    }
    
    void loop()
    {
      //输出
      Serial.println(col.a);
      delay(1000);    
    }
    

    如果以上内容对你有帮助,你可以通过打赏支持作者

    该用户从未签到

    发表于 2013-3-2 00:19 | 显示全部楼层
    支持一下,忽略理解共同体的妙处了,哈

    该用户从未签到

    发表于 2013-3-7 20:01 | 显示全部楼层
    很不错啊,谢谢了

    该用户从未签到

    发表于 2013-3-9 10:56 | 显示全部楼层
    学习了,谢谢楼主

    该用户从未签到

    发表于 2013-4-7 17:36 | 显示全部楼层
    原来共用体可以这样活用,谢谢楼主分享

    该用户从未签到

    发表于 2013-8-30 09:58 | 显示全部楼层
    很感谢,呵呵

    该用户从未签到

    发表于 2013-9-9 18:48 | 显示全部楼层
    支持一下,忽略理解共同体的妙处了,哈

    该用户从未签到

    发表于 2013-10-23 17:33 | 显示全部楼层
    共用体使使几种不同类型的变量存放到同一段内存单元中

    该用户从未签到

    发表于 2013-10-31 15:44 | 显示全部楼层
    very useful, good for you landlord
  • TA的每日心情
    奋斗
    2016-11-11 11:29
  • 签到天数: 8 天

    [LV.3]偶尔看看II

    发表于 2013-12-11 11:47 | 显示全部楼层
    原來 union 是這麼使用法, 謝謝樓主的範例解說, 學了一課。
    您需要登录后才可以回帖 登录 | 立即注册  

    本版积分规则

    热门推荐

    KittenBot杯第六届开源硬件开发大赛启动啦
    KittenBot杯第六届开源硬
    大赛简介: 第六届开源硬件开发大赛由Arduino中文社区发起 由KittenBot冠名赞助
    游戏机和开发板脑洞一下;这个本来就是开源的。
    游戏机和开发板脑洞一下;
    这个开发板和标准UNO是1;1的;通用。做在一起是因为可以不用游戏机时可以切换回来做开
    新人求助,关于舵机和限位开关。
    新人求助,关于舵机和限位
    新人求助社区各位哥哥姐姐,具体需要用航模遥控器的3段开关控制Arduino nano控制一个3
    基于MWC开源飞控DIY关键总结分享:
    基于MWC开源飞控DIY关键总
    很早就已经很想写这么一个帖,但总是由于各种原因没能落实,但最后还是找了时
    有关函数返回值的问题
    有关函数返回值的问题
    求助大神们,这个程序中有return返回值,但为什么有这个“ warning: return-statement
    Copyright   ©2015-2016  Arduino中文社区  Powered by©Discuz!   ( 蜀ICP备14017632号-3 )
    快速回复 返回顶部 返回列表