EEPROM,或写作E2PROM,全称电子抹除式可复写只读存储器 (英语:Electrically-Erasable Programmable Read-Only Memory),是一种可以通过电子方式多次复写的半导体存储设备。
arduino的控制芯片中都自带了EEPROM,它的用途比较广,掉电后需要保存的信息都可以存储到这里。比如电子保险箱的密码。
咱们先用官方库做一个实验,在第五个地址中写入99,然后再读出来,通过串口输出。ARDUINO 代码复制打印
- #include 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() {
- }
下面就是实验的效果
官方的EEPROM库只能一个地址一个地址的进行读写,如果遇到int(2 bytes),long(4 bytes)或者数组等等,就需要自己进行拆分成1 bytes才能进行存储,不是很方便。
我们可以使用eeprom_anything这个程序来处理这种复杂的问题。
我们把附件下载下来后,一定要把eeprom_anything的两个文件,与需要编译的程序文件放在一个目录中。
下面这个是程序代码,在EEPROM中存储,long、float、int、char四种不同类型的数据。ARDUINO 代码复制打印
- #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或者更新的是无法使用的。
第二段代码用到的附件:
test.zip (1.55 KB, 下载次数: 176)
感谢ASSISS童鞋对问题代码进行了优化编写,现在只要2行代码就能解决这个问题了。而且0022,0023也可以使用ARDUINO 代码复制打印
- #include 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编译出来的问题件居然还要大一些。。。晕了晕了。
ARDUINO 代码复制打印
- #include 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
- }
2
|
|
|
|
最后一段代码能存到EEPROM里面么?调了两天了,好像存不进去吧?
|
|
|
|
|