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

arduinohardwaresoftware & coding更新于 2026/2/15 17:07:17

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

相关文章