如何使用Arduino从EEPROM中获取任意大小的数据?

Arduino Uno 具有 1 kB 的 EEPROM 存储空间。EEPROM 是一种非易失性存储器,即掉电后其内容仍会保留。因此,它可用于存储您希望跨电源循环保持不变的数据。配置或设置是此类数据的示例。

在本文中,我们将看到如何从 EEPROM 中获取任意大小(不仅仅是一个字节)的数据。我们将介绍 Arduino 中的一个内置示例。可以从 -文件 → 示例 → EEPROM访问 EEPROM 示例。

示例

我们将查看eeprom_get示例。此示例假设您已通过运行eeprom_put示例中的代码预先设置了 Arduino 的 EEPROM 中的数据。换句话说,eeprom_put示例是该示例的前身。

感兴趣的主要功能是。它需要两个参数,开始读取数据的起始地址,以及存储读取数据的变量(可以是原始类型,如float或自定义struct)。其他基本数据类型的示例有shortintlongchardouble等。此函数根据要存储读取数据的变量的大小确定要读取的字节数。EEPROM.get()

我们从包含库开始。

#include <EEPROM.h>

代码中稍后定义了一个全局结构。

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 */
}