如何使用Arduino从EEPROM中获取任意大小的数据?
ArduinoUno具有1kB的EEPROM存储空间。EEPROM是一种非易失性存储器,即掉电后其内容仍会保留。因此,它可用于存储您希望跨电源循环保持不变的数据。配置或设置是此类数据的示例。
在本文中,我们将看到如何从EEPROM中获取任意大小(不仅仅是一个字节)的数据。我们将介绍Arduino中的一个内置示例。可以从-文件→示例→EEPROM访问EEPROM示例。
示例
我们将查看eeprom_get示例。此示例假设您已通过运行eeprom_put示例中的代码预先设置了Arduino的EEPROM中的数据。换句话说,eeprom_put示例是该示例的前身。
感兴趣的主要功能是。它需要两个参数,开始读取数据的起始地址,以及存储读取数据的变量(可以是原始类型,如float或自定义struct)。其他基本数据类型的示例有short、int、long、char、double等。此函数根据要存储读取数据的变量的大小确定要读取的字节数。EEPROM.get()
我们从包含库开始。
#include
代码中稍后定义了一个全局结构。
struct MyObject { float field1; byte field2; char name[10]; };
在Setup中,我们首先初始化Serial,然后从EEPROM的开头(地址=0)读取一个浮点数。然后我们在函数中读取一个结构体secondTest()(我们首先将EEPROM读取地址移动一个浮点数的大小,然后创建一个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); //如果EEPROM中的数据不是有效的浮点数,这可能会打印'ovf,nan'。 /*** As get also returns a reference to 'f', you can use it inline. E.g: Serial.print( EEPROM.get( eeAddress, f ) ); ***/ /*** Get can be used with custom structures too. I have separated this into an extra function. ***/ secondTest(); //运行下一个测试。 } void secondTest() { int eeAddress = sizeof(float); //将地址移动到float'f'之后的下一个字节。 MyObject customVar; //用于存储从EEPROM读取的自定义对象的变量。 EEPROM.get(eeAddress, customVar); Serial.println("从EEPROM读取自定义对象: "); Serial.println(customVar.field1); Serial.println(customVar.field2); Serial.println(customVar.name); }
循环中什么也没有发生。
void loop() { /* Empty loop */ }