You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何检查ESP32中EEPROM.read(0)地址是否存储有效数值

ESP32 EEPROM 有效数据校验实现方案

未写入状态的返回规则

ESP32 没有原生硬件 EEPROM,官方 Arduino 核心的 EEPROM.h 库是通过 Flash 扇区模拟 EEPROM 功能,未经过任何写入操作的存储地址,返回值固定为 0xFF(十进制 255),这是 Flash 芯片擦除后的默认状态。

校验方案建议

不推荐直接用返回值是否为 255 做判断,因为你的业务有效数据可能本身就包含 255,更稳妥的方案是使用自定义魔法值标记:

  • 预留 1~2 个 EEPROM 地址作为有效标记位,写入自定义的魔法值(选择非 0xFF 的数值即可,例如 0x5A)
  • 每次读取业务数据前先读标记位,判断是否和你定义的魔法值一致:
    • 一致:说明已写入过有效数据,直接读取业务值即可
    • 不一致:说明是首次使用或者存储区域损坏,写入默认值同时把魔法值写到标记位

示例代码

#include <EEPROM.h>

// 自定义魔法值,只要不是0xFF即可
#define EEPROM_MAGIC 0x5A
// 预定义的业务默认值
#define DEFAULT_BUSINESS_VAL 80

void setup() {
  // 初始化EEPROM,按需分配大小,最小4字节,最大4096字节
  EEPROM.begin(512);

  uint8_t magicFlag = EEPROM.read(0);
  uint8_t businessVal;

  if (magicFlag == EEPROM_MAGIC) {
    // 有有效数据,读取地址1的业务值
    businessVal = EEPROM.read(1);
  } else {
    // 无有效数据,写入默认值
    businessVal = DEFAULT_BUSINESS_VAL;
    EEPROM.write(0, EEPROM_MAGIC);
    EEPROM.write(1, businessVal);
    // 提交修改到Flash,必须调用才会持久化存储
    EEPROM.commit();
  }

  // 后续直接使用businessVal即可
}

补充说明

  • 如果你的业务数据需要占用地址0,可以把魔法值标记位放到其他空闲地址,只要预留1字节的存储空间即可
  • 如果需要更高的可靠性,可以用2字节魔法值,或者额外增加CRC校验,避免Flash损坏导致的误判

内容的提问来源于stack exchange,提问作者user14603676

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 21:18:01