ESP32 开发笔记——NVS

一、操作流程

初始化——》打开——》读/写——》保存——》关闭

1.NVS初始化

//函数作用:初始化NVS分区
//传参:
//      无
//返回值:
//    ESP_OK  打开成功
esp_err_t nvs_flash_init(void)

2.打开命名空间

//函数作用:从NVS分区打开具有给定命名空间的非易失性存储
//传参:
//    1.namespace_name:     要打开的命名空间的名称
//    2.open_mode:          权限(NVS_READONLY只读、NVS_READWRITE读写)
//    3.out_handle:         返回句柄
//返回值:
//    ESP_OK  打开成功

esp_err_t nvs_open(const char * namespace_name,
                     nvs_open_mode_t open_mode,
                     nvs_handle_t * out_handle)

3.数据读取

//函数作用:从命名空间中读取单个数据
//传参:
//    1.handle:           空间的句柄
//    2.key:              键名
//    3.out_value:        指向输出的指针
//返回值:
//    ESP_OK               读取成功
esp_err_t nvs_get_i8  (nvs_handle_t handle, const char* key, int8_t* out_value);
esp_err_t nvs_get_u8  (nvs_handle_t handle, const char* key, uint8_t* out_value);
esp_err_t nvs_get_i16 (nvs_handle_t handle, const char* key, int16_t* out_value);
esp_err_t nvs_get_u16 (nvs_handle_t handle, const char* key, uint16_t* out_value);
esp_err_t nvs_get_i32 (nvs_handle_t handle, const char* key, int32_t* out_value);
esp_err_t nvs_get_u32 (nvs_handle_t handle, const char* key, uint32_t* out_value);
esp_err_t nvs_get_i64 (nvs_handle_t handle, const char* key, int64_t* out_value);
esp_err_t nvs_get_u64 (nvs_handle_t handle, const char* key, uint64_t* out_value);


//函数作用:从命名空间中读取字符串
//传参:
//    1.handle:           空间的句柄
//    2.key:              键名
//    3.out_value:        指向输出的指针
//    4.length:            out_value的长度
//返回值:
//    ESP_OK               读取成功
esp_err_t nvs_get_str (  nvs_handle_t handle,
                         const char* key, 
                         char* out_value,
                         size_t* length);

4.数据写入

//函数作用:向命名空间中写入单个数据
//传参:
//    1.handle:           空间的句柄
//    2.key:              键名
//    3.value:            写入的数据
//返回值:
//    ESP_OK               写入成功
esp_err_t nvs_set_i8  (nvs_handle_t handle, const char* key, int8_t value);
esp_err_t nvs_set_u8  (nvs_handle_t handle, const char* key, uint8_t value);
esp_err_t nvs_set_i16 (nvs_handle_t handle, const char* key, int16_t value);
esp_err_t nvs_set_u16 (nvs_handle_t handle, const char* key, uint16_t value);
esp_err_t nvs_set_i32 (nvs_handle_t handle, const char* key, int32_t value);
esp_err_t nvs_set_u32 (nvs_handle_t handle, const char* key, uint32_t value);
esp_err_t nvs_set_i64 (nvs_handle_t handle, const char* key, int64_t value);
esp_err_t nvs_set_u64 (nvs_handle_t handle, const char* key, uint64_t value);


//函数作用:向命名空间中写入字符串
//传参:
//    1.handle:           空间的句柄
//    2.key:              键名
//    3.value:            字符串地址
//返回值:
//    ESP_OK               写入成功
esp_err_t nvs_set_str (nvs_handle_t handle, const char* key, const char* value);

5.数据删除

//函数作用:删除整个空间的数据

esp_err_t nvs_erase_all(nvs_handle_t handle);


//函数作用:删除空间中某个key的数据
esp_err_t nvs_erase_key(nvs_handle_t handle, const char* key);

5.保存更改

//函数作用:保存更改的内容
//传参:
//    1.handle:           空间的句柄
//返回值:
//    ESP_OK               保存成功
esp_err_t nvs_commit(nvs_handle_t c_handle)

6.关闭命名空间

//函数作用:关闭打开的空间
//传参:
//    1.handle:           空间的句柄
//返回值:
//    ESP_OK               关闭成功
void nvs_close(nvs_handle_t handle)

二、示例代码

#include <stdio.h>
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "esp_system.h"
#include "nvs_flash.h"
#include "nvs.h"

nvs_handle my_handle;                                   //nvs flash存储句柄  wifi
char *ssid_key="ssid_str";                              //ssid 存储位置
char *pwd_key="pwd_str";                                //pwd 存储位置
uint32_t flash_read_len=100;                            //读取长度
static char wifi_ssid_str[50]="redmi";                  //ssid 读取后存放数组
static char wifi_pwd_str[100]="23456789";                //pwd 读取后存放数组  

void app_main(void)
{
    // 初始化 NVS
    esp_err_t  ret = nvs_flash_init();
    if (ret == ESP_ERR_NVS_NO_FREE_PAGES || ret == ESP_ERR_NVS_NEW_VERSION_FOUND) {
        ESP_ERROR_CHECK(nvs_flash_erase());
        ret = nvs_flash_init();
    }
    //**********************************写**************************************//
    nvs_open("hx_list", NVS_READWRITE, &my_handle);//打开  
    nvs_set_str (my_handle, ssid_key, wifi_ssid_str);//写入ssid&pwd
    nvs_set_str (my_handle, pwd_key, wifi_pwd_str);
    nvs_commit(my_handle);//保存
    nvs_close(my_handle);//关闭
    //**********************************读**************************************//
    nvs_open("hx_list", NVS_READWRITE, &my_handle);//打开
    nvs_get_str (my_handle, ssid_key, wifi_ssid_str, (size_t *)&flash_read_len);//读取
    nvs_get_str (my_handle, pwd_key, wifi_pwd_str, (size_t *)&flash_read_len);
    nvs_commit(my_handle);//提交,必须提交才能写入NVS
    nvs_close(my_handle);//关闭
    //**********************************删**************************************//
    nvs_open("hx_list", NVS_READWRITE, &my_handle);//打开
    nvs_erase_all(my_handle);//擦除
    nvs_commit(my_handle);//保存
    nvs_close(my_handle);//关闭

    return;
}


    
    

注意:nvs_get_str读取数据时容易失败,重复读取两次并加延时可以避免

    

    //读取    避免读取失败
    nvs_get_str (my_handle, ssid_key, wifi_ssid_str, (size_t *)&flash_read_len);
    sys_delay_ms(100);
    nvs_get_str (my_handle, ssid_key, wifi_ssid_str, (size_t *)&flash_read_len);
    sys_delay_ms(100);
    nvs_get_str (my_handle, pwd_key, wifi_pwd_str, (size_t *)&flash_read_len);
    sys_delay_ms(100);
    nvs_get_str (my_handle, pwd_key, wifi_pwd_str, (size_t *)&flash_read_len);
    

  • 8
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
您好!对于ESP32来说,如果您想将结构体数组存储到NVS(Non-Volatile Storage)中,可以按照以下步骤进行操作: 1. 首先,确保您已经在ESP32上初始化了NVS。可以使用ESP-IDF提供的API或者ESP32 Arduino库中的相关函数来实现这一步骤。 2. 定义您的结构体数组,并且确保每个结构体都是可序列化的。这意味着结构体中的所有成员变量都是基本数据类型或者可序列化的自定义类型。 3. 使用NVS API将结构体数组存储到NVS中。以下是一个示例代码片段: ```c #include <nvs.h> typedef struct { int value1; float value2; // 其他成员变量... } MyStruct; #define STORAGE_NAMESPACE "storage" void saveStructArray(MyStruct* array, size_t size) { nvs_handle_t nvsHandle; esp_err_t err = nvs_open(STORAGE_NAMESPACE, NVS_READWRITE, &nvsHandle); if (err != ESP_OK) { // 错误处理 return; } err = nvs_set_blob(nvsHandle, "array", array, size * sizeof(MyStruct)); if (err != ESP_OK) { // 错误处理 return; } err = nvs_commit(nvsHandle); if (err != ESP_OK) { // 错误处理 return; } nvs_close(nvsHandle); } ``` 在上述示例中,我们使用`nvs_set_blob`函数将结构体数组保存到NVS中。`array`参数是结构体数组的指针,`size`参数是数组的大小。我们将整个结构体数组作为一个二进制块进行保存。 4. 当您需要从NVS中恢复结构体数组时,可以使用类似的方法,使用`nvs_get_blob`函数从NVS中获取二进制数据,并将其转换回结构体数组。 希望这些信息对您有所帮助!如果您有任何其他问题,请随时提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值