如何使用 Arduino 从 EEPROM 获取任意大小的数据?
Arduino Uno 拥有 1 kB 的 EEPROM 存储空间。EEPROM 是一种非易失性存储器,也就是说,即使断电后其内容也能保留。因此,它可以用来存储您希望在电源循环期间保持不变的数据。配置或设置就是此类数据的示例。
在本文中,我们将了解如何从 EEPROM 获取任意大小(不仅仅是一个字节)的数据。我们将演示一个 Arduino 内置的示例。您可以从 − 文件 → 示例 → EEPROM 访问 EEPROM 示例。
示例
我们将研究 eeprom_get 示例。本示例假设您已通过运行 eeprom_put 示例中的代码预设了 Arduino EEPROM 中的数据。换句话说,eeprom_put 示例是本示例的先行示例。
主要关注的函数是 EEPROM.get()。它接受两个参数:读取数据的起始地址,以及用于存储读取数据的变量(可以是原始类型,例如 float,也可以是自定义的 struct)。其他原始数据类型的示例包括 short、int、long、char、double 等。此函数根据要存储读取数据的变量的大小确定要读取的字节数。
我们首先要包含库。
#include <EEPROM.h>
代码后面定义了一个全局结构体。
struct MyObject {
float field1;
byte field2;
char name[10];
};
在设置程序中,我们首先初始化串口,并从 EEPROM 的起始位置(address = 0)读取一个浮点数。然后在 secondTest() 函数中读取一个 struct 结构体(我们首先将 EEPROM 读取地址移动一个浮点数的大小,然后创建一个 struct 类型的对象,并将其读入其中)。之后,我们逐一打印 struct 结构体中的字段。
void setup() {
float f = 0.00f; //用于存储从 EEPROM 读取的数据的变量。
int eeAddress = 0; //从 EEPROM 读取数据的起始地址
Serial.begin(9600);
while (!Serial) {
; // 等待串口连接。仅适用于原生 USB 端口
}
Serial.print(&"从 EEPROM 读取浮点数:");
//从 EEPROM 中获取位置为"eeAddress"的浮点数据 EEPROM.get(eeAddress, f);
Serial.println(f, 3); //这可能会打印"ovf, nan"如果 EEPROM 中的数据不是有效的浮点数。
/***
由于 get 函数也返回对 'f' 的引用,因此您可以内联使用它。
例如:Serial.print( EEPROM.get( eeAddress, f ) );
***/
/***
Get 函数也可以与自定义结构体一起使用。
我已将其拆分为一个额外的函数。
***/
secondTest(); //运行下一个测试。
}
void secondTest() {
int eeAddress = sizeof(float); //将地址移动到浮点型"f"后的下一个字节。
MyObject customVar; //用于存储从 EEPROM 读取的自定义对象的变量。
EEPROM.get(eeAddress, customVar);
Serial.println("Read custom object from EEPROM: ");
Serial.println(customVar.field1);
Serial.println(customVar.field2);
Serial.println(customVar.name);
}
Nothing happens in the loop.
void loop() {
/* Empty loop */
}

