基于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 有一定的存储空间限制,需要合理使用。

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

相关推荐
QuantumStack1 小时前
【C++ 真题】P1104 生日
开发语言·c++·算法
whoarethenext1 小时前
使用 C++/OpenCV 和 MFCC 构建双重认证智能门禁系统
开发语言·c++·opencv·mfcc
代码的奴隶(艾伦·耶格尔)2 小时前
后端快捷代码
java·开发语言
Jay_5152 小时前
C++多态与虚函数详解:从入门到精通
开发语言·c++
路来了2 小时前
Python小工具之PDF合并
开发语言·windows·python
xiaolang_8616_wjl3 小时前
c++文字游戏_闯关打怪
开发语言·数据结构·c++·算法·c++20
WJ.Polar3 小时前
Python数据容器-list和tuple
开发语言·python
small_wh1te_coder3 小时前
硬件嵌入式学习路线大总结(一):C语言与linux。内功心法——从入门到精通,彻底打通你的任督二脉!
linux·c语言·汇编·嵌入式硬件·算法·c
FrostedLotus·霜莲4 小时前
C++主流编辑器特点比较
开发语言·c++·编辑器
超级码.里奥.农4 小时前
零基础 “入坑” Java--- 七、数组(二)
java·开发语言