如何检查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
相关产品推荐
相关产品推荐

