You need to enable JavaScript to run this app. ESP32使用Preferences.h无法写入EEPROM 掉电后数据丢失问题求助
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.14 09:54:01