nvs是非易失性存储器,数据存放到flash里面,分区表里面有规定nvs的大小,起始地址,对于nvs的读写是分空间的,不同空间彼此独立(即A空间存入的数据不会影响B空间),在空间中写入键值对,即可完成数据的保存。

#include <stdio.h>
#include "esp_log.h"
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "esp_err.h"
#include "nvs.h"
#include "string.h"
#include "nvs_flash.h"

static const char* TAG = "main";
//定义命名空间1
#define NVS_BOB_NAMESPACE  "Bob"        //namespace最长15字节
//定义命名空间2
#define NVS_JOHN_NAMESPACE  "John"      //namespace最长15字节
//定义键值对
#define NVS_AGE_KEY    "age"        //年龄键名
#define NVS_SEX_KEY    "sex"        //性别键名
//命名空间的句柄
nvs_handle_t nvs_handle1=NULL;
nvs_handle_t nvs_handle2=NULL;
//定义读取数据的数组
char buffer[64];
//nvs_open_mode_t open_mode

void my_nvs_read(char *namespace,char *key,void *buffer,int maxlen,nvs_handle_t my_nvs_handle){
    //读之前先初始化数组
    memset(buffer,0,(size_t)sizeof(buffer));
    size_t lenth;
    //读取空间1
    nvs_open(namespace,NVS_READWRITE,&my_nvs_handle);
    //第一次读传入的地址为空,函数只返回lenth的值,后续可以根据lenth进行二次读取
    nvs_get_blob(my_nvs_handle,key,NULL,&lenth);
    if(lenth && lenth<= maxlen){
        nvs_get_blob(my_nvs_handle,key,buffer,&lenth);
    }
    nvs_close(my_nvs_handle);
}

void my_nvs_write(char *namespace,nvs_handle_t my_nvs_handle,char *data,char *my_key){
    nvs_open(namespace,NVS_READWRITE,&my_nvs_handle);
    nvs_set_blob(my_nvs_handle,my_key,data,strlen(data));
    nvs_commit(my_nvs_handle);
    nvs_close(my_nvs_handle);
}
void my_nvs_init(){
        esp_err_t err = nvs_flash_init();
    if(err!=ESP_OK){
        nvs_flash_erase();
        //如果有错误会阻塞,不往下执行
        ESP_ERROR_CHECK(nvs_flash_init());
    }
}
void app_main(void)
{
    my_nvs_init();
    my_nvs_write(NVS_BOB_NAMESPACE,nvs_handle1,"woshi",NVS_AGE_KEY);
    my_nvs_write(NVS_BOB_NAMESPACE,nvs_handle1,"wangshan",NVS_SEX_KEY);
    my_nvs_write(NVS_JOHN_NAMESPACE,nvs_handle2,"woshi-3 ",NVS_AGE_KEY);
    my_nvs_write(NVS_JOHN_NAMESPACE,nvs_handle2,"wangshan-3",NVS_SEX_KEY);
    // //打开空间1
    // nvs_open(NVS_BOB_NAMESPACE,NVS_READWRITE,&nvs_handle1);
    // //空间1写入数据
    // nvs_set_blob(nvs_handle1,NVS_AGE_KEY,"woshi",strlen("woshi"));
    // nvs_set_blob(nvs_handle1,NVS_SEX_KEY,"wangshan",strlen("wangshan"));
    // nvs_commit(nvs_handle1);
    // nvs_close(nvs_handle1);
    //打开空间2
    // nvs_open(NVS_JOHN_NAMESPACE,NVS_READWRITE,&nvs_handle2);
    // //空间2写入数据
    // nvs_set_blob(nvs_handle2,NVS_AGE_KEY,"woshi-2",strlen("woshi-2"));
    // nvs_set_blob(nvs_handle2,NVS_SEX_KEY,"wangshan-2",strlen("wangshan-2"));
    // nvs_commit(nvs_handle2);
    // nvs_close(nvs_handle2);
    //读取空间1
    my_nvs_read(NVS_BOB_NAMESPACE,NVS_AGE_KEY,buffer,64,nvs_handle1);
    ESP_LOGI(TAG,"Read data:%s",buffer);
    my_nvs_read(NVS_BOB_NAMESPACE,NVS_SEX_KEY,buffer,64,nvs_handle1);
    ESP_LOGI(TAG,"Read data:%s",buffer);
    my_nvs_read(NVS_JOHN_NAMESPACE,NVS_AGE_KEY,buffer,64,nvs_handle2);
    ESP_LOGI(TAG,"Read data:%s",buffer);
    my_nvs_read(NVS_JOHN_NAMESPACE,NVS_SEX_KEY,buffer,64,nvs_handle2);
    ESP_LOGI(TAG,"Read data:%s",buffer);
}

更多推荐