ESP32S3学习——nvs_非易失性存储

NVS库在ESP32S3中用于存储键值对数据,适合小数据量,不适用于大对象。键值对包括各种整型和字符串,键必须唯一。命名空间减少冲突,每个键值对属于特定命名空间。初始化、读取、写入和异常处理步骤清晰,确保数据安全。

芯片:esp32s3

开发环境:espidfv4.4

一、官网相关资料

简介

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

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

键值对

NVS 的操作对象为键值对,其中键是 ASCII 字符串,当前支持的最大键长为 15 个字符。值可以为以下几种类型:

  • 整数型:uint8_tint8_tuint16_tint16_tuint32_tint32_tuint64_tint64_t

  • 以 0 结尾的字符串;

  • 可变长度的二进制数据 (BLOB)

键必须唯一。为现有的键写入新的值可能产生如下结果:

  • 如果新旧值数据类型相同,则更新值;

  • 如果新旧值数据类型不同,则返回错误。</

### ESP32-S3 使用 Arduino NVS 存储数据教程 #### 初始化NVS存储模块 为了确保能够正常读取和写入非易失性存储器,在程序启动时需要初始化NVS。这一步骤对于任何希望利用NVS功能的应用都是必不可少的。 ```cpp #include <nvs.h> #include <nvs_flash.h> void setup() { Serial.begin(115200); // 初始化NVS闪存 esp_err_t err = nvs_flash_init(); if (err == ESP_ERR_NVS_NO_FREE_PAGES || err == ESP_ERR_NVS_NEW_VERSION_FOUND) { // 如果NVS分区尚未被擦除,则执行此操作后再尝试重新初始化 ESP_ERROR_CHECK(nvs_flash_erase()); err = nvs_flash_init(); } ESP_ERROR_CHECK(err); // 继续其他设置... } ``` 上述代码展示了如何安全地处理可能遇到的不同错误情况,比如当NVS页面已满或是版本不匹配时采取适当措施[^4]。 #### 向NVS中保存字符串类型的键值对 下面的例子说明了怎样把一个简单的字符串保存到指定命名空间下的特定键名处: ```cpp void saveStringToNVS(const char* namespaceName, const char* key, const String& value){ nvs_handle myHandle; esp_err_t err; // 打开或创建一个新的/现有的名称空间用于读写访问权限 err = nvs_open(namespaceName, NVS_READWRITE, &myHandle); if (err != ESP_OK) { Serial.printf("Error (%u) opening NVS handle!\n", err); return; } // 将字符串写入给定的key位置 err = nvs_set_str(myHandle, key, value.c_str()); if (err != ESP_OK) { Serial.printf("Error (%u) writing string to NVS\n", err); } else { // 提交更改至持久化存储nvs_commit(myHandle); Serial.println("Data written successfully"); } // 关闭句柄以释放资源 nvs_close(myHandle); } ``` 这段代码实现了向NVS内设定具体名字空间里边的一个字符串型别的条目,并且确认这些改动已经被提交到了永久性的储存区域之中[^1]。 #### 从NVS读回之前存储的信息 这里提供了一个函数来检索先前已经存在於相同命名空间内的某个键所对应的值: ```cpp String readStringFromNVS(const char* namespaceName, const char* key){ nvs_handle myHandle; size_t required_size; char *value = NULL; String result; esp_err_t err = nvs_open(namespaceName, NVS_READONLY, &myHandle); if (err != ESP_OK) { Serial.printf("Error (%u) opening NVS handle.\n", err); return ""; } // 获取所需缓冲区大小 err = nvs_get_str(myHandle, key, NULL, &required_size); if (err == ESP_OK && required_size > 0) { value = new char[required_size]; // 实际获取字符串内容 err = nvs_get_str(myHandle, key, value, &required_size); if (err == ESP_OK) { result = String(value); } else { Serial.printf("Error reading from NVS! %d\n", err); } delete[] value; // 清理动态分配的空间 } else { Serial.printf("Failed to determine the length of stored data or no such entry exists."); } nvs_close(myHandle); return result; } ``` 该部分逻辑负责查询并返回由`namespaceName`定义的作用域以及关联着`key`标识符的具体文本串对象;如果找不到对应记录则会给出提示信息。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值