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);
    

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值