esp32-nvs使用

news/2024/7/7 19:55:15 标签: esp32
_____ 使用步骤
1, 初始化 nvs 分区
2, 打开 namespaec
3, 读取或写入键值
如果是 string 或数组类型,先读长度
-- 获取单个数据的值
1, 初始化分区
    // Initialize NVS
    esp_err_t err = nvs_flash_init();
    if (err == ESP_ERR_NVS_NO_FREE_PAGES || err == ESP_ERR_NVS_NEW_VERSION_FOUND) {
        // NVS partition was truncated and needs to be erased
        // Retry nvs_flash_init
        ESP_ERROR_CHECK(nvs_flash_erase());
        err = nvs_flash_init();
    }
    ESP_ERROR_CHECK(err);

2, 打开 namespace, 获得句柄

    nvs_handle_t my_handle;
    err = nvs_open("binCode", NVS_READWRITE, &my_handle);
如果不是默认分区,用另一个函数
         nvs_open_from_partition
3, 读取 key 值
        int32_t restart_counter = 0; // value will default to 0, if not set yet in NVS
        err = nvs_get_i32(my_handle, "restart_counter", &restart_counter);
4, 设置 key 值
    err = nvs_set_i32(my_handle, "restart_counter", restart_counter);
-- 获取数组的值
可以先读数组的长度
然后再读数组的值
获取 string 的值和数组的值类似, nvs_set_str
区别在于 string 类型最后一个字符为 '\0'
 
  esp_err_t err = nvs_flash_init();

    printf("Opening Non-Volatile Storage (NVS) handle... ");
    nvs_handle_t my_handle;
    err = nvs_open("spaceName", NVS_READWRITE, &my_handle);
    if (err != ESP_OK) {
        printf("Error (%s) opening NVS handle!\n", esp_err_to_name(err));
    } else {
        printf("Done\n");
        // Read run time blob
        size_t required_size = 0; // value will default to 0, if not set yet in NVS
        // obtain required memory space to store blob being read from NVS
        err = nvs_get_blob(my_handle, "datas", NULL, &required_size);
        if (err != ESP_OK && err != ESP_ERR_NVS_NOT_FOUND) {
            printf("fail, return from nvs_get_blob:\n");
            return;
        }
        printf("Run time:\n");
        if (required_size == 0) {
            printf("Nothing saved yet!\n");
        } else {
            uint8_t *testBin = malloc(required_size);
            err = nvs_get_blob(my_handle, "datas", testBin, &required_size);
            if (err != ESP_OK) {
                free(testBin);
                return;
            }
            for (int i = 0; i < required_size / sizeof(uint32_t); i++) {
                printf("%d: %d\n", i + 1, testBin[i]);
            }
            free(testBin);
        }

_____ 库文件

#include "nvs_flash.h"
#include "nvs.h"
_____ nvs.h
支持的类型
typedef enum {
    NVS_TYPE_U8    = 0x01,  /*!< Type uint8_t */
    NVS_TYPE_I8    = 0x11,  /*!< Type int8_t */

http://www.niftyadmin.cn/n/5535167.html

相关文章

openlayer 鼠标点击船舶,打开船舶简单弹框

背景&#xff1a; 对创建的地图对象&#xff0c;可以添加上监听事件&#xff0c;常用的有&#xff1a;地图点击事件、鼠标移动事件。 通过监听这些事件&#xff0c;又可以区分不同图层的不同要素&#xff0c;获取不同数据&#xff1b; 根据这些数据&#xff0c;又可以发起网络请…

每日复盘-20240704

今日关注&#xff1a; 20240704 六日涨幅最大: ------1--------300391--------- 长药控股 五日涨幅最大: ------1--------300391--------- 长药控股 四日涨幅最大: ------1--------300391--------- 长药控股 三日涨幅最大: ------1--------300391--------- 长药控股 二日涨幅最…

HTTP与HTTPS协议区别及应用场景

HTTP&#xff08;超文本传输​​协议&#xff09;和 HTTPS&#xff08;安全超文本传输​​协议&#xff09;都是用于通过网络传输数据的协议。虽然它们有一些相似之处&#xff0c;但在安全性和数据保护方面也存在显著差异。 在这篇博文中&#xff0c;我们将探讨 HTTP 和 HTTPS…

如何避免爬取网站时IP被封?

互联网协议 (IP) 地址是识别网络抓取工具的最常见方式。IP 是每个互联网交换的核心&#xff0c;对其进行跟踪和分析可以了解很多有关连接客户端的信息。 在网络抓取中&#xff0c;IP 跟踪和分析&#xff08;又名指纹&#xff09;通常用于限制和阻止网络抓取程序或其他不需要的访…

鸿蒙小案例-自定义键盘

一个自定义键盘 效果 完成简单的26键中英文输入 使用&#xff1a; Entry Component struct IndexInput {State text: string inputController: TextInputController new TextInputController()//自定义键盘关闭事件hideClick(){this.inputController.stopEditing()}//自定义…

C++ 教程 - 08 文件操作与异常处理

文章目录 文件操作文件对象其他方法异常处理 文件操作 需要头文件 <iostream><fstream> 读取文件 ifstream obj; obj.open(const char* filename, std::in)写入文件ofstream obj; obj.open(const char* filename, std::out)读、写文件 fstream&#xff0c;包含了i…

2024.7.4

2024.7.4 【又苦又甜&#xff0c;也挺好嘛&#xff0c;很像生活】 Thursday 五月廿九 <theme oi-“graph theory”> P2865 [USACO06NOV] Roadblocks G 主要就是求一个严格次短路&#xff0c;但是有一定条件&#xff0c; 道路可以连续走 我们先求解出最短路&#xff0…

探索 ES6:现代 JavaScript 的新特性

随着 JavaScript 的不断演进&#xff0c;ECMAScript 2015&#xff08;简称 ES6&#xff09;作为 JavaScript 的一次重大更新&#xff0c;带来了许多新特性和语法改进&#xff0c;极大地提升了开发体验和代码质量。本文将详细介绍 ES6 的主要新特性&#xff0c;并展示如何在实际…