查看: 38154|回复: 41

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

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

    [LV.5]常住居民I

    发表于 2013-2-27 02:06 | 显示全部楼层 |阅读模式
    你可能发现了,使用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 n=0;n<4;n++)
      EEPROM.write(n, col.b[n]);
      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 c;
    int addr = 0;
    int led = 13;
    
    void setup(){
      for(int n=0;n<4;n++)
      c.b[n]=EEPROM.read(n);
      Serial.begin(9600);     
    }
    
    void loop(){
      //输出
      Serial.println(c.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 是這麼使用法, 謝謝樓主的範例解說, 學了一課。
    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    热门推荐

    创客火首发无人机编队套装,开启不一样的人工智能教育
    创客火首发无人机编队套装
    2017年国务院发布《新一代人工智能发展规划》,提出要广泛开展人工智能科普活动,在中
    <ESP8266NodeMCU>网络连接问题
    <ESP8266NodeMCU>网络连接
    在我家的WiFi可以连上,但在学校里无论是WiFi还是手机热点就是连不上。 想让各位康
    基于机器视觉的智能分拣机械臂
    基于机器视觉的智能分拣机
    本作品是一个基于机器视觉的智能机械臂操作平台,其采用atmega32单片机作为主控制系统
    晒图ESP8266一个框架
    晒图ESP8266一个框架
    好久没发帖了,出来活跃活跃一下。ESP8266免身份登录截图。 最近外研究新的架构M2M或P
    blinker做的卧室灯开关发现一个问题
    blinker做的卧室灯开关发
    做了一个卧室灯开关并安装到墙壁86盒中,实现了小爱同学,墙壁开关点动控制开关灯.看起
    Copyright   ©2015-2016  Arduino中文社区  Powered by©Discuz!   
    快速回复 返回顶部 返回列表