ESP32使用Preferences.h无法写入EEPROM 掉电后数据丢失问题求助
问题排查及解决方案
核心问题1:写入操作未完整落盘
注意Preferences库底层使用ESP32的NVS(非易失性存储)分区,不是传统的EEPROM,所有put类写入操作都会先暂存在RAM缓存中,只有执行到preferences.end()时才会将缓存数据批量刷入Flash存储。
你当前的写入逻辑放在loop中,必须满足以下要求才会真正生效:
savescore被设置为true后,必须完整跑完一次写入分支的全部逻辑,直到preferences.end()执行完成- 如果你在
preferences.end()执行完成前就断电,所有写入操作都会丢失,下次上电自然只能读到默认值
核心问题2:缺少写入成功校验
你当前没有任何逻辑判断写入是否真的成功,建议在写入时增加返回值校验:
// put类函数返回值为实际写入的字节数,返回0代表写入失败 if(preferences.putDouble("score0", highscoreScores[0]) == 0) { Serial.println("score0写入失败"); }
你可以逐一校验每个键值的写入结果,快速定位是哪个环节出了问题。
其他可能的诱因
- 如果你是烧录代码后第一次测试,注意大部分烧录工具默认会在烧录时擦除整个Flash分区,之前的存储数据会被清空,烧录后需要先触发一次完整的写入流程再断电测试
- 部分旧版本ESP32 Arduino内核的Preferences库对
double类型的读写存在兼容性问题,你可以临时把highscoreScores的类型从double替换为float测试是否能正常存储 - 确认你触发
savescore = true的逻辑没有时序问题:不要在刚设置savescore = true后就立刻手动断电,至少预留100ms以上的运行时间让MCU跑完写入逻辑
快速调试方案
在写入分支的preferences.end()执行完成后加一行打印:
Serial.println("所有数据写入完成,可断电测试");
待串口打印出这条信息后再断电,即可排除写入未执行完成的问题。
内容的提问来源于stack exchange,提问作者sharkyenergy
相关产品推荐
相关产品推荐

