Arduino ESP32 对NVS数据操作测试

Arduino ESP32 对NVS数据操作测试


  • NVS数据操作,所需加载的头文件Preferences.h

对命名空间初始化函数begin()操作测试一

bool begin(const char * name, bool readOnly=false, const char* partition_label=NULL);

  • prefs.begin("test",true);设置成true
#include <Arduino.h>
#include <Preferences.h>

void setup() {
    Serial.begin(115200);
    Serial.println();
    delay(2000);

    Preferences prefs;
    prefs.begin("test",true);
    Serial.println(prefs.freeEntries());
    if(prefs.isKey("name")) { // 如果当前命名空间中有键名为"name"的元素
        Serial.printf("name: %s\n\n", prefs.getString("name").c_str());
        Serial.println("removing...");
        if(prefs.remove("name")){
          Serial.println("succese!");
         Serial.println(prefs.freeEntries());
          }else{
             Serial.println(" 移除失败");
             Serial.println(prefs.freeEntries());
          }

           prefs.end();
          //ESP.restart();
    
    } else {
        size_t num = prefs.putString("name", "perseverance"); // 获取当前命名空间中的键名为"name"的值
                                                        // 如果没有该元素则返回默认值"555"
        Serial.printf("name: %d\n\n", num);
        Serial.println(prefs.freeEntries());

        //prefs.putString("name", "233");
        prefs.end();
        delay(5000);
       // ESP.restart();
    }
}

void loop() {}

  • 串口打印信息
    在这里插入图片描述

对命名空间初始化函数begin()操作测试二

修改命名空间初始参数,改为false

#include <Arduino.h>
#include <Preferences.h>

void setup() {
    Serial.begin(115200);
    Serial.println();
    delay(2000);

    Preferences prefs;
    prefs.begin("test",false);
    Serial.println(prefs.freeEntries());//获取空余nvs空间
    if(prefs.isKey("name")) { // 如果当前命名空间中有键名为"name"的元素
        Serial.printf("name: %s\n\n", prefs.getString("name").c_str());
        Serial.println("removing...");
        if(prefs.remove("name")){
          Serial.println("succese!");
         Serial.println(prefs.freeEntries());
          }else{
             Serial.println(" 移除失败");
             Serial.println(prefs.freeEntries());
          }

           prefs.end();
          //ESP.restart();
    
    } else {
        size_t num = prefs.putString("name", "perseverance"); // 获取当前命名空间中的键名为"name"的值
        Serial.printf("name: %d\n\n", num);//打印输入数据的长度
        Serial.println(prefs.freeEntries());
        prefs.end();
        delay(5000);
       // ESP.restart();
    }
}

void loop() {}

  • 串口打印输出结果
    在这里插入图片描述

总结:在给命名空间初始化函数参数给true:是没有移除和写入权限的,只有读取数据的权限,而参数false,则相反。如果使用prefs.begin("test")默认参数是false的,也就是说具有写入和删除功能的。

测试代码(三)

如果命名空间初始化函数prefs.begin("test",true);将不停的重复重启。因为参数为true,没有写入权限,写不进数据,所以下次重启后还是读不到数据。

#include <Arduino.h>
#include <Preferences.h>

void setup() {
    Serial.begin(115200);
    Serial.println();
    delay(2000);

    Preferences prefs;
    prefs.begin("test",false);
    Serial.println(prefs.freeEntries());//获取空余nvs空间
    if(prefs.isKey("name")) { // 如果当前命名空间中有键名为"name"的元素
        Serial.printf("name: %s\n\n", prefs.getString("name").c_str());
        Serial.println("removing...");
        if(prefs.remove("name")){
          Serial.println("succese!");
         Serial.println(prefs.freeEntries());
          }else{
             Serial.println(" 移除失败");
             Serial.println(prefs.freeEntries());
          }
           prefs.end();
          //ESP.restart();  
    } else {
      Serial.println("Preferences中没有name键名。");
        size_t num = prefs.putString("name", "perseverance9527"); // 获取当前命名空间中的键名为"name"的值
        Serial.printf("name: %d\n\n", num);
        Serial.println(prefs.freeEntries());
       Serial.printf("name: %s\n\n", prefs.getString("name").c_str());
        prefs.end();
        delay(5000);
        ESP.restart();
    }
}

void loop() {}

测试代码四

分别falsetrue下的读取数据。

#include <Arduino.h>
#include <Preferences.h>

void setup() {
    Serial.begin(115200);
    Serial.println();
    delay(2000);

    Preferences prefs;
    prefs.begin("test",false);
    Serial.println(prefs.freeEntries());//获取空余nvs空间

        size_t num = prefs.putString("name", "perseverance9527"); // 获取当前命名空间中的键名为"name"的值
                                                        // 如果没有该元素则返回默认值"555"
        Serial.printf("name: %d\n\n", num);
        Serial.println(prefs.freeEntries());
       Serial.printf("name: %s\n\n", prefs.getString("name").c_str());
        prefs.end();
       // delay(5000);
      //  ESP.restart();

}

void loop() {
      Preferences prefs;
      prefs.begin("test",true);
      Serial.println(prefs.freeEntries());//获取空余nvs空间
       Serial.printf("name: %s\n\n", prefs.getString("name").c_str());
        prefs.end();
        delay(5000);
  
  }

在这里插入图片描述

写这篇补充的文章,主要是加深对NVS数据操作的熟悉,以及Preferences头文件中的函数的了解。

  • 6
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 9
    评论
ESP32 Arduino的掉电存储是指在ESP32芯片断电或重启后,能够保留一些数据或状态的功能。ESP32芯片具有内置的非易失性存储器(NVS),可以用于存储配置参数、状态信息等。 在ESP32 Arduino中,可以使用EEPROM库来操作NVS,实现掉电存储的功能。EEPROM库提供了一些函数,如EEPROM.begin()用于初始化NVS,EEPROM.write()用于写入数据,EEPROM.read()用于读取数据等。 以下是一个简单的示例代码,演示如何使用EEPROM库在ESP32 Arduino中进行掉电存储: ```arduino #include <EEPROM.h> // 定义存储的数据结构 struct ConfigData { int param1; float param2; }; void setup() { EEPROM.begin(sizeof(ConfigData)); // 初始化NVS,参数为数据结构的大小 } void loop() { // 读取数据 ConfigData config; EEPROM.get(0, config); // 从NVS的地址0开始读取数据到config // 对读取的数据进行处理 // ... // 写入数据 config.param1 = 123; config.param2 = 3.14; EEPROM.put(0, config); // 将config写入NVS的地址0处 // 等待一段时间,确保数据写入NVS delay(100); // 断电或重启后,重新读取数据 EEPROM.get(0, config); // 继续处理数据 // ... } ``` 在这个示例中,我们定义了一个ConfigData结构来存储配置参数。在setup函数中,通过EEPROM.begin函数初始化NVS,参数为ConfigData结构的大小。在loop函数中,我们先使用EEPROM.get函数读取NVS中的数据,然后对数据进行处理,然后使用EEPROM.put函数将修改后的数据写回NVS中。 需要注意的是,ESP32的NVS有限,不适合存储大量数据。同时,频繁的写入操作可能会降低NVS的寿命。因此,在使用掉电存储时,需要注意数据大小和写入频率,以确保系统的稳定性和可靠性。
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值