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


NVS非易失性存储库介绍

非易失性存储 (NVS) 库主要用于在 flash 中存储键值格式的数据。本文档将详细介绍 NVS 常用的一些概念。

  • 引用:https://docs.espressif.com/projects/esp-idf/zh_CN/latest/esp32/api-reference/storage/nvs_flash.html

NVS 最适合存储一些较小的数据,而非字符串或二进制大对象 (BLOB) 等较大的数据。如需存储较大的 BLOB 或者字符串,请考虑使用基于磨损均衡库的 FAT 文件系统。

在Arduino框架下,NVS区域在分区表上的体现:

分区表配置文件位置:C:\Users\Administrator\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.4\tools\partitions

  • Arduino IDE分区表配置信息选项:

NVS区域具体在每一份分区表当中的体现

app13Mfat3M.csv为例:

在Arduino环境下,不同的分区表默认配置的NVS容量都是5000 Byte(字节)

NVS 存储对象

像用户的一般数据存储例如wifi信息,eeprom库也是使用了其中的一部分。

用户如何使用NVS 来存储数据

相关头文件位置:C:\Users\Administrator\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.4\libraries\Preferences\src

  • 获取数据函数

        int8_t getChar(const char* key, int8_t defaultValue = 0);uint8_t getUChar(const char* key, uint8_t defaultValue = 0);int16_t getShort(const char* key, int16_t defaultValue = 0);uint16_t getUShort(const char* key, uint16_t defaultValue = 0);int32_t getInt(const char* key, int32_t defaultValue = 0);uint32_t getUInt(const char* key, uint32_t defaultValue = 0);int32_t getLong(const char* key, int32_t defaultValue = 0);uint32_t getULong(const char* key, uint32_t defaultValue = 0);int64_t getLong64(const char* key, int64_t defaultValue = 0);uint64_t getULong64(const char* key, uint64_t defaultValue = 0);float_t getFloat(const char* key, float_t defaultValue = NAN);double_t getDouble(const char* key, double_t defaultValue = NAN);bool getBool(const char* key, bool defaultValue = false);size_t getString(const char* key, char* value, size_t maxLen);String getString(const char* key, String defaultValue = String());size_t getBytesLength(const char* key);size_t getBytes(const char* key, void * buf, size_t maxLen);
  • 读取数据函数
        size_t putChar(const char* key, int8_t value);size_t putUChar(const char* key, uint8_t value);size_t putShort(const char* key, int16_t value);size_t putUShort(const char* key, uint16_t value);size_t putInt(const char* key, int32_t value);size_t putUInt(const char* key, uint32_t value);size_t putLong(const char* key, int32_t value);size_t putULong(const char* key, uint32_t value);size_t putLong64(const char* key, int64_t value);size_t putULong64(const char* key, uint64_t value);size_t putFloat(const char* key, float_t value);size_t putDouble(const char* key, double_t value);size_t putBool(const char* key, bool value);size_t putString(const char* key, const char* value);size_t putString(const char* key, String value);size_t putBytes(const char* key, const void* value, size_t len);
  • 数据操作函数
 bool clear();bool remove(const char * key);

操作流程

键值对使用注意事项

  • NVS 的操作对象为键值对,其中键是 ASCII 字符串,当前支持的最大键长为 15 个字符。(键的名字不要取过长的字符串名)
  • 在同一个命名空间(NameSpace)当中,键名不能有重复。

示例程序

本示例展示的是对结构体数据对象进行存储,比起使用eeprom库来实现,在操作上来讲要简单的多。

/*
This example shows how to use Preferences (nvs) to store a
structure.  Note that the maximum size of a putBytes is 496K
or 97% of the nvs partition size.  nvs has signifcant overhead,
so should not be used for data that will change often.
*/
#include <Preferences.h>//引入头文件
Preferences prefs;typedef struct {uint8_t hour;uint8_t minute;uint8_t setting1;uint8_t setting2;
} schedule_t;void setup() {Serial.begin(115200);delay(2000);while(!Serial);prefs.begin("schedule"); // use "schedule" namespaceSerial.println(prefs.freeEntries());//获取该"schedule" 命名空间大小:414uint8_t content[] = {9, 30, 235, 255, 20, 15, 0, 1}; // two entriesprefs.putBytes("schedule", content, sizeof(content));//将数组存储进"schedule"命名的空间size_t schLen = prefs.getBytesLength("schedule");char buffer[schLen]; // prepare a buffer for the dataprefs.getBytes("schedule", buffer, schLen);//获取"schedule"命名的空间数据的大小if (schLen % sizeof(schedule_t)) { // 对存储的数据进行校验log_e("Data is not correct size!");return;}schedule_t *schedule = (schedule_t *) buffer; // 用结构体指针指向buffer数组名,将数组成员赋值给结构体成员变量Serial.printf("%02d:%02d %d/%d\n", schedule[1].hour, schedule[1].minute,schedule[1].setting1, schedule[1].setting2);//20:15 0/1Serial.printf("%02d:%02d %d/%d\n", schedule[0].hour, schedule[0].minute,schedule[0].setting1, schedule[0].setting2);//09:30 235/255schedule[2] = {8, 30, 20, 21}; // add a third entry (unsafely)// force the struct array into a byte arrayprefs.putBytes("schedule", schedule, 3*sizeof(schedule_t)); schLen = prefs.getBytesLength("schedule");char buffer2[schLen];prefs.getBytes("schedule", buffer2, schLen);for (int x=0; x<schLen; x++) Serial.printf("%02X ", buffer[x]);//09 1E EB FF 14 0F 00 01 08 1E 14 15Serial.println();
}void loop() {}
  • 串口打印信息

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

  1. ESP32C3基于Arduino框架下的 ESP32 RainMaker开发示例教程

    ESP32C3基于Arduino框架下的 ESP32 RainMaker开发示例教程 ESP RainMaker ESP RainMaker 是乐鑫推出的一个端到端平台.基于该平台,用户无需管理基础设 ...

  2. Arduino框架下 ESP32看门狗使用示例

    Arduino框架下 ESP32看门狗使用示例 相关篇<Arduino ESP32 看门狗定时器> 开发板型号为:ESP32 DEVKIT V1-DOIT 板载led灯 GPIO 2 -- ...

  3. Arduino框架下通过TFT_eSPI库驱动ESP32+合宙1.54“ 电子墨水屏(e-paper)显示

    Arduino框架下通过TFT_eSPI库驱动ESP32+合宙1.54" 电子墨水屏(e-paper)显示 demo演示效果 相关库 EPD_Libraries:https://github ...

  4. Arduino框架下ESP32+合宙1.54“ 电子墨水屏(e-paper)驱动显示示例

    Arduino框架下ESP32+合宙1.54" 电子墨水屏(e-paper)驱动显示示例 显示效果展示; 合宙1.54" 电子墨水屏 有关合宙1.54"电子墨水屏的介绍资 ...

  5. ESP32基于Arduino框架下U8g2驱动I2C OLED 时间显示

    ESP32基于Arduino框架下U8g2驱动I2C OLED时间显示

  6. STM32F103C8T6在Arduino框架下驱动SH1106 1.3“ IIC OLED显示

    STM32F103C8T6在Arduino框架下驱动SH1106 1.3" IIC OLED显示 效果展示: 相关篇<STM32duino开发的底层驱动程序-bootloader> ...

  7. Arduino框架下STM32F1/F4系列HID模式程序烧录教程

    Arduino框架下STM32F1/F4系列HID模式程序烧录教程 相关篇<Arduino框架下STM32全系列开发固件安装指南> HID BootLoader烧录模式 "Upl ...

  8. STM32F103C8T6基于Arduino框架下利用定时器跑RBG灯闪烁

    STM32F103C8T6基于Arduino框架下利用定时器跑RGB灯闪烁

  9. STM32G070RBT6基于Arduino框架下点灯程序

    STM32G070RBT6基于Arduino框架下点灯程序 ✨说明:Arduino STM32系列开发环境搭建不在本示例范围内. 相关篇<[硬件开源电路]STM32G070RBT6开发板> ...

最新文章

  1. C++中一些类和数据结构的大小的总结
  2. 基于B/S模式的推送
  3. zookeeper思维导图
  4. python从excel中读取数据
  5. J2EE技术-Hibernate
  6. 免费赠送2本新书《iOS程序员面试笔试真题与解析》
  7. 《码出高效-阿里巴巴Java开发手册-泰山版》阿里最新出品的泰山版Java开发手册,告别垃圾代码
  8. dos 教程(很全的)
  9. 上海交大计算机系王楠,交通学院本科生学生组织干部名单
  10. Uptime-Kuma 一个轻量的开源监控工具
  11. 网银支付 加密解密说明
  12. linux格式化sd卡,并进行挂载
  13. 平面设计初学者如何入门
  14. Hero image网站转化这么高?21个最佳案例给你参考
  15. 【CTF题】使用文件包含漏洞读取网页代码
  16. gcc / -Wl,-Bsymbolic
  17. 基于Springboot+Mybatis+mysql+vue技术交流博客论坛系统
  18. 魅族mx四核即将使用android,魅族MX四核真机主板曝光 6月份即将上市
  19. 从零开始,如何拥有自己的博客网站【华为云至简致远】
  20. vue中h5下滑加载更多

热门文章

  1. Build a project
  2. matlab 稀疏随机矩阵,Matlab 稀疏矩阵函数
  3. Windows7下Foxmail不能使用问题解决一例
  4. Android Studio 连接雷电模拟器
  5. 2023款联想小新pro16和Thinkbook16+ 区别选哪个 更值得入手
  6. JAVA:(游戏:四子连)
  7. 微信小程序-001-抽签功能-006-我的抽签-主界面
  8. 1688获得店铺详情数据教程
  9. 移位运算为什么比乘法除法快
  10. ESP8266开发板+mysql数据库+DHT11