Arduino ESP32 对NVS数据操作测试

Posted perseverance52

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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头文件中的函数的了解。

以上是关于Arduino ESP32 对NVS数据操作测试的主要内容,如果未能解决你的问题,请参考以下文章

Arduino ESP32将数据保存到NVS中

Arduino框架下ESP32 EEPROM库函数实现对各数据类型保存示例

Arduino框架下对ESP32 NVS非易失性存储解读以及应用示例

Arduino ESP32 利用EEPROM对数据进行读写操作

Arduino ESP32Web配网

MicroPython ESP32NVS数据非易失性存储示例讲解说明