arduino教程系列30-EEPROM读写实验

弘毅 于 2013-5-3 21:41 编辑





EEPROM,或写作E2PROM,全称电子抹除式可复写只读存储器 (英语:Electrically-Erasable Programmable Read-Only Memory),是一种可以通过电子方式多次复写的半导体存储设备。



arduino的控制芯片中都自带了EEPROM,它的用途比较广,掉电后需要保存的信息都可以存储到这里。比如电子保险箱的密码。



咱们先用官方库做一个实验,在第五个地址中写入99,然后再读出来,通过串口输出。ARDUINO 代码复制打印

#include <EEPROM.h>
 
int address = 5;
int value;
 
void setup() {
  Serial.begin(9600);
 
  // 在address 5上写入数值99
  EEPROM.write(address, 99);
 
  // 读取address 5上的内容
  value = EEPROM.read(address);
 
  //  将value输出到Serial port
  Serial.print(value,DEC);  // 串口输出99
  Serial.print("\n");
}
 
void loop() {
}

下面就是实验的效果


2011-12-5 21-03-27.png

2011-12-5 21:41 上传
(37.89 KB)





官方的EEPROM库只能一个地址一个地址的进行读写,如果遇到int(2 bytes),long(4 bytes)或者数组等等,就需要自己进行拆分成1 bytes才能进行存储,不是很方便。



我们可以使用eeprom_anything这个程序来处理这种复杂的问题。

我们把附件下载下来后,一定要把eeprom_anything的两个文件,与需要编译的程序文件放在一个目录中。


2011-12-5 18-36-13.png

2011-12-5 21:41 上传
(88.01 KB)





下面这个是程序代码,在EEPROM中存储,long、float、int、char四种不同类型的数据。

#include "eeprom_anything.h"
 
// 定义一个包含long, int, float, char[] 等各种类别的 config_type 结构
struct config_type
{
  long alarm;
  float average;
  int mode;
  char password[10];
};
 
// 测试EEPROM_writeAnything()与测试EEPROM_readAnything()两个命令
void eeprom_test()
{
  // 1) 定义结构变量config,并定义config的内容
  config_type config;
  config.alarm = 12345;
  config.average = 3.14;
  config.mode = 1;
  strcpy(config.password, "arduino");
 
  // 2) 把变量config存储到EEPROM,从地址0开始写入。
  EEPROM_writeAnything(0, config);
 
  // 3) 从EEPROM地址0开始读取,结果存储在config_readback
  config_type config_readback;
  EEPROM_readAnything(0, config_readback);
 
  // 4) 通过串口输出读取回来的资料
  Serial.print("alarm: ");
  Serial.println(config_readback.alarm);
  Serial.print("average: ");
  Serial.println(config_readback.average);
  Serial.print("mode: ");
  Serial.println(config_readback.mode);
  Serial.print("password: ");
  Serial.println(config_readback.password);  
}  
 
void setup()
{
  // 开启Serial port,设置波特率为9600
  Serial.begin(9600);
 
  // 运行测试程序
  eeprom_test();  
}
 
void loop()
{
  // do nothing  
}



此代码目前只能在0018或者更早的IDE中编译,0022或者更新的是无法使用的。


2011-12-5 18-37-35.png

2011-12-5 21:41 上传
(75.98 KB)





第二段代码用到的附件:442_test.zip

网盘下载http://pan.baidu.com/s/1dExdYV3



感谢ASSISS童鞋对问题代码进行了优化编写,现在只要2行代码就能解决这个问题了。而且0022,0023也可以使用

#include <EEPROM.h>
#define EEPROM_write(address, p) {int i = 0; byte *pp = (byte*)&(p);for(; i < sizeof(p); i++) EEPROM.write(address+i, pp[i]);}
#define EEPROM_read(address, p)  {int i = 0; byte *pp = (byte*)&(p);for(; i < sizeof(p); i++) pp[i]=EEPROM.read(address+i);}
 
// 定义一个包含long, int, float, char[] 等各种类别的 config_type 结构
struct config_type
{
  long alarm;
  float average;
  int mode;
  char password[10];
};
 
// 测试EEPROM_writeAnything()与测试EEPROM_readAnything()两个命令
void eeprom_test()
{
  // 1) 定义结构变量config,并定义config的内容
  config_type config;
  config.alarm = 12345;
  config.average = 3.14;
  config.mode = 1;
  strcpy(config.password, "arduino");
 
  // 2) 把变量config存储到EEPROM,从地址0开始写入。
  EEPROM_write(0, config);
 
  // 3) 从EEPROM地址0开始读取,结果存储在config_readback
  config_type config_readback;
  EEPROM_read(0, config_readback);
 
  // 4) 通过串口输出读取回来的资料
  Serial.print("alarm: ");
  Serial.println(config_readback.alarm);
  Serial.print("average: ");
  Serial.println(config_readback.average);
  Serial.print("mode: ");
  Serial.println(config_readback.mode);
  Serial.print("password: ");
  Serial.println(config_readback.password);  
}  
 
void setup()
{
  // 开启Serial port,设置波特率为9600
  Serial.begin(9600);
 
  // 运行测试程序
  eeprom_test();  
}
 
void loop()
{
  // do nothing  
}



再放出一个代码,是ASSISS童鞋改用AVR自带的eepron函数进行读写操作,大家可以研究下。。和调用arduino的封装有什么不同。我发现调用AVR编译出来的问题件居然还要大一些。。。晕了晕了。

#include <avr/eeprom.h>
#define EEPROM_write(address, var) eeprom_write_block((const void *)&(var), (void *)(address), sizeof(var))
#define EEPROM_read(address, var) eeprom_read_block((void *)&(var), (const void *)(address), sizeof(var)) 
// 定义一个包含long, int, float, char[] 等各种类别的 config_type 结构
struct config_type
{
  long alarm;
  float average;
  int mode;
  char password[10];
};
 
// 测试EEPROM_writeAnything()与测试EEPROM_readAnything()两个命令
void eeprom_test()
{
  // 1) 定义结构变量config,并定义config的内容
  config_type config;
  config.alarm = 12345;
  config.average = 3.14;
  config.mode = 1;
  strcpy(config.password, "arduino");
 
  // 2) 把变量config存储到EEPROM,从地址0开始写入。
  EEPROM_write(0, config);
 
  // 3) 从EEPROM地址0开始读取,结果存储在config_readback
  config_type config_readback;
  EEPROM_read(0, config_readback);
 
  // 4) 通过串口输出读取回来的资料
  Serial.print("alarm: ");
  Serial.println(config_readback.alarm);
  Serial.print("average: ");
  Serial.println(config_readback.average);
  Serial.print("mode: ");
  Serial.println(config_readback.mode);
  Serial.print("password: ");
  Serial.println(config_readback.password);  
}  
 
void setup()
{
  // 开启Serial port,设置波特率为9600
  Serial.begin(9600);
 
  // 运行测试程序
  eeprom_test();  
}
 
void loop()
{
  // do nothing  
}


via - 极客工坊

标签: Arduino教程