基于esp32实现键值对存储读写c程序例程

在基于 ESP32 的系统中,我们可以使用 NVS(Non-Volatile Storage,非易失性存储)来实现系统配置参数的掉电存储和读写。NVS 是 ESP32 提供的一种存储机制,允许我们将键值对数据存储在闪存中,即使设备掉电,数据也不会丢失。

以下是一个简单的 C 程序例程,展示了如何使用 NVS 进行系统配置参数的读写:

c

#include <stdio.h>

#include "nvs_flash.h"

#include "nvs.h"

// 定义一个函数用于写入配置参数

esp_err_t write_config_parameter(const char* key, int value) {

// 打开 NVS 命名空间

nvs_handle_t my_handle;

esp_err_t err = nvs_open("storage", NVS_READWRITE, &my_handle);

if (err != ESP_OK) {

printf("Error (%s) opening NVS handle!\n", esp_err_to_name(err));

return err;

}

// 写入参数

err

= nvs_set_i32(my_handle, key, value);

if (err != ESP_OK) {

printf("Error (%s) writing to NVS!\n", esp_err_to_name(err));

} else {

// 提交更改

err

= nvs_commit(my_handle);

if (err != ESP_OK) {

printf("Error (%s) committing to NVS!\n", esp_err_to_name(err));

}

}

// 关闭 NVS 句柄

nvs_close(my_handle);

return err;

}

// 定义一个函数用于读取配置参数

esp_err_t read_config_parameter(const char* key, int* value) {

// 打开 NVS 命名空间

nvs_handle_t my_handle;

esp_err_t err = nvs_open("storage", NVS_READONLY, &my_handle);

if (err != ESP_OK) {

printf("Error (%s) opening NVS handle!\n", esp_err_to_name(err));

return err;

}

// 读取参数

err

= nvs_get_i32(my_handle, key, value);

switch (err) {

case ESP_OK:

printf("Read parameter %s: %d\n", key, *value);

break;

case ESP_ERR_NVS_NOT_FOUND:

printf("Parameter %s not found!\n", key);

break;

default :

printf("Error (%s) reading from NVS!\n", esp_err_to_name(err));

}

// 关闭 NVS 句柄

nvs_close(my_handle);

return err;

}

void app_main() {

// 初始化 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);

// 定义要读写的键和值

const char* key = "config_param";

int write_value = 123;

// 写入配置参数

err

= write_config_parameter(key, write_value);

if (err == ESP_OK) {

printf("Parameter %s written successfully!\n", key);

}

// 读取配置参数

int read_value;

err

= read_config_parameter(key, &read_value);

if (err == ESP_OK) {

printf("Parameter %s read successfully: %d\n", key, read_value);

}

}

代码说明:

  1. 初始化 NVS:在 app_main 函数中,我们首先调用 nvs_flash_init() 来初始化 NVS。如果 NVS 分区被截断或有新版本,我们需要擦除并重试。

  2. 写入配置参数:write_config_parameter 函数用于将一个整数参数写入 NVS。我们首先打开 NVS 命名空间,然后使用 nvs_set_i32 写入参数,最后调用 nvs_commit 提交更改。

  3. 读取配置参数:read_config_parameter 函数用于从 NVS 中读取一个整数参数。我们打开 NVS 命名空间,使用 nvs_get_i32 读取参数,并根据返回值进行相应的处理。

  4. 主函数:在 app_main 函数中,我们调用 write_config_parameter 写入一个参数,然后调用 read_config_parameter 读取该参数,并打印结果。

注意事项:

• 这个例程只是一个简单的示例,实际应用中可能需要处理更多的数据类型和错误情况。

• NVS 有一定的存储空间限制,需要合理使用。

• 在写入和读取参数时,要确保键的唯一性。

相关推荐
WWJA王文举4 小时前
I²C通信完整流程详解:START、地址、ACK、数据、Repeated START和STOP一次讲透
c语言·开发语言
zhanghaha13144 小时前
Python进阶教程:6_JSON 数据解析 —— 新手完全指南
开发语言·python·json
qq_448011166 小时前
C语言中的动态内存分配
c语言·开发语言·php
动词ing6 小时前
【学习笔记】C语言(数组指针与指针数组+字符数组+函数+参数传递+字符串作为形参+递归函数+指针函数+回调函数+结构体嵌套+内存动态分配函数)
c语言·笔记·学习
汉字萌萌哒6 小时前
2024CSP-J入门级C++真题详解
开发语言·c++
arbboter7 小时前
【网络工具】NetProxy网络代理用户手册
开发语言·网络·c#·网络代理·网络异常·代理工具
汉字萌萌哒8 小时前
2019CCF-CSP入门级C++试题解析
java·开发语言·c++
叠层归一研究院8 小时前
AGI 系统(十一):二阶网络 — 二阶递归 × 多主体 (元符号网络)
开发语言·人工智能·算法·php·agi
小雨笙笙8 小时前
C语言:变量三属性——存储类型
c语言·开发语言
果果燕9 小时前
C++ 学习笔记(二):类与对象—— 构造函数与析构函数
开发语言·c++