ESP32使用Preferences库存储chainCounter到非易失闪存的问题咨询
解决ESP32 Preferences库读取/存储整数变量问题
核心问题分析
你的代码无法读取闪存中保存的chainCounter值,根源在于读取操作的时机错误:在全局作用域调用preferences.getInt()时,Preferences实例还未通过begin()初始化,此时无法访问闪存,只能返回默认值0。另外,当前代码在setup中刚初始化就立刻存储初始值,也不符合实际需求(应该在变量变化后再存储)。
你的疑问解答
相关语句的位置
Preferences preferences;可以全局定义,方便整个代码调用。preferences.begin()、getInt()、putInt()这些操作必须放在setup()或其他运行时函数中,且**getInt()和putInt()必须在begin()之后执行**。preferences.end()可以在完成一批读写操作后调用,如果后续还需要读写,也可以暂时不调用(但建议在不需要访问闪存时关闭,节省资源)。
变量
chainCounter的定义- 使用
int类型完全符合需求,因为ESP32的Preferences库支持存储带符号的32位整数,能够正确保存正负数值。
- 使用
修正后的代码示例
#include "sensesp/sensors/digital_output.h" #include "sensesp/controllers/smart_switch_controller.h" #include "sensesp/sensors/digital_input.h" #include "sensesp/sensors/sensor.h" #include "sensesp/signalk/signalk_output.h" #include "sensesp/system/lambda_consumer.h" #include "sensesp/transforms/debounce.h" #include "sensesp/transforms/linear.h" #include "sensesp/transforms/lambda_transform.h" #include "sensesp/transforms/moving_average.h" #include "sensesp_app.h" #include "sensesp_app_builder.h" #include <Preferences.h> #include <math.h> using namespace sensesp; reactesp::ReactESP app; Preferences preferences; int chainCounter; // 先声明变量,不初始化 void setup() { // 初始化Preferences,第二个参数false表示可读写模式 preferences.begin("my_app", false); // 此时才能从闪存读取保存的值 chainCounter = preferences.getInt("counter", 0); // 关闭Preferences(如果后续不需要立刻读写,可以先关闭) preferences.end(); // ------------------- // 其他原有代码 // ------------------- sensesp_app->start(); } // 示例:当chainCounter变化时,调用此函数保存到闪存 void saveChainCounter() { preferences.begin("my_app", false); preferences.putInt("counter", chainCounter); preferences.end(); } void loop() { app.tick(); // 示例:假设这里有代码修改chainCounter,比如按键触发增减 // if(按键按下) { // chainCounter++; // saveChainCounter(); // 修改后立刻保存 // } }
关键注意事项
- 每次需要读写闪存时,都要先调用
preferences.begin("my_app", false),操作完成后调用preferences.end()。 - 只有当
chainCounter的值发生变化时,才需要调用putInt()保存,避免频繁写入闪存(闪存有写入次数限制,减少不必要的写入能延长寿命)。 - 确保
begin()的命名空间(第一个参数"my_app")前后一致,否则会读取不同的存储区域。
内容的提问来源于stack exchange,提问作者gregy
相关产品推荐
相关产品推荐

