极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 73766|回复: 27

Arduino中利用EEPROM存储double和float类型的数据(使用共用体)

[复制链接]
发表于 2012-10-28 21:57:14 | 显示全部楼层 |阅读模式
本帖最后由 shenhaiyu 于 2015-6-4 13:11 编辑

有的时候我们需要将float或者double类型的数据存到EEPROM中以备下次利用,比如制作电子称存储皮重等信息时。
但是Arduino的EEPROM仅仅能以8bit一位存储1024位。
在网上查了一下,貌似使用共用体的方法很火,于是写了个代码:

数据拆分存储部分:
  1.   dvalue.v = 169600.00;
  2.   unsigned char *dpointer;
  3.   dpointer = dvalue.dchar;
  4.   for(int i = 0; i < 8; i++) {
  5.     EEPROM.write(i,*dpointer);
  6.     dpointer++;
  7.   }
复制代码
数据读取部分:
  1.   for(int i = 0; i < 8; i++) dvalue.dchar[i] = EEPROM.read(i);
  2.   Serial.println(dvalue.v);
复制代码
完整示例代码:
  1. #include <EEPROM.h>

  2. union data {
  3.   double v;
  4.   unsigned char dchar[8];
  5. } dvalue;

  6. void setup() {
  7.   Serial.begin(9600);
  8.   
  9.   //数据拆分
  10.   dvalue.v = 169600.00;
  11.   unsigned char *dpointer;
  12.   dpointer = dvalue.dchar;
  13.   for(int i = 0; i < 8; i++) {
  14.     EEPROM.write(i,*dpointer);
  15.     dpointer++;
  16.   }
  17. }

  18. void loop()
  19. {
  20.   //数据还原
  21.   for(int i = 0; i < 8; i++) dvalue.dchar[i] = EEPROM.read(i);
  22.   Serial.println(dvalue.v);
  23.   delay(1000);
  24. }
复制代码
当仅仅要存取float类型时,只需要把v前面的double改为float,把循环和声明dchar中的8改为4即可。






EEPROM库中貌似还有个put方法可以存各种数据类型,感谢18# 葱拌豆腐 提供
http://www.arduino.cc/en/Reference/EEPROM
回复

使用道具 举报

发表于 2012-10-28 22:41:26 | 显示全部楼层
收下了,非常感谢
回复 支持 反对

使用道具 举报

发表于 2012-10-29 13:16:11 | 显示全部楼层
有点问题吧
double类型在avr-gcc里和float一样是4字节的
回复 支持 反对

使用道具 举报

发表于 2012-10-29 17:31:00 | 显示全部楼层
是呢
8位16位单片机的C,实型数很薄弱
连库不少浮点函数都没
回复 支持 反对

使用道具 举报

发表于 2013-3-7 16:49:01 | 显示全部楼层
这个不错,学习了
回复 支持 反对

使用道具 举报

发表于 2013-5-14 14:19:57 | 显示全部楼层
太好了!马上要用到!
回复 支持 反对

使用道具 举报

发表于 2013-5-14 14:20:18 | 显示全部楼层
哦,刚忘了说:谢谢楼主!
回复 支持 反对

使用道具 举报

发表于 2013-11-17 20:21:50 | 显示全部楼层
本帖最后由 kingone 于 2013-11-17 22:39 编辑

不知道怎么办,processing中尽然不能定义union共用体,不知道processing是怎么搞的?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-11-18 11:20:04 | 显示全部楼层
kingone 发表于 2013-11-17 20:21
不知道怎么办,processing中尽然不能定义union共用体,不知道processing是怎么搞的?

呃,这个,我也不了解proccessing
回复 支持 反对

使用道具 举报

发表于 2013-11-18 15:49:21 | 显示全部楼层
不错!收藏了!谢谢楼主!:)
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-11-19 11:51:51 | 显示全部楼层
wangchenxicool 发表于 2013-11-18 15:49
不错!收藏了!谢谢楼主!:)

谢谢支持~~
回复 支持 反对

使用道具 举报

发表于 2014-12-11 14:54:31 | 显示全部楼层
楼主请问下,要是我要保存日期时间的?例如:2014,12,11,14,53,00。具体到秒
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-12-12 09:26:51 | 显示全部楼层
鲫鱼鲫鱼 发表于 2014-12-11 14:54
楼主请问下,要是我要保存日期时间的?例如:2014,12,11,14,53,00。具体到秒

时间本身就是double型的吧。最笨的办法分解时间分别存储
回复 支持 反对

使用道具 举报

发表于 2014-12-12 23:17:43 | 显示全部楼层

刚刚接触

shenhaiyu 发表于 2014-12-12 09:26
时间本身就是double型的吧。最笨的办法分解时间分别存储


我是接触这种单片机的,懂你的意思,但不知道怎么搞额
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-3-7 19:38:38 | 显示全部楼层
鲫鱼鲫鱼 发表于 2014-12-12 23:17
我是接触这种单片机的,懂你的意思,但不知道怎么搞额

那就靠你自己设计了
回复 支持 反对

使用道具 举报

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

本版积分规则 需要先绑定手机号

Archiver|联系我们|极客工坊

GMT+8, 2024-3-29 19:13 , Processed in 0.047221 second(s), 25 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表