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

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

相关推荐
程序员编程指南1 小时前
Qt 移动应用发布与分发指南
c语言·开发语言·c++·qt
工程师0071 小时前
C#反射的概念与实战
开发语言·c#·反射
程序员编程指南1 小时前
Qt 与物联网(IoT)开发
c语言·开发语言·c++·qt·物联网
秋风起,再归来~1 小时前
C++从入门到起飞之——智能指针!
开发语言·c++·算法
野原鑫之祝1 小时前
嵌入式开发学习———Linux环境下IO进程线程学习(一)
linux·c语言·学习·vim·嵌入式
草莓熊Lotso1 小时前
【数据结构初阶】--二叉树(六)
c语言·数据结构·经验分享·笔记·其他
破刺不会编程2 小时前
linux线程互斥和同步
linux·运维·服务器·开发语言·网络
embrace992 小时前
【C语言学习】scanf函数
c语言·开发语言·汇编·学习·青少年编程·c#·编辑器
归云鹤2 小时前
QT 动态属性和静态属性
开发语言·数据库·qt
重生之我是Java开发战士2 小时前
【C语言】深度剖析指针(三):回调机制、通用排序与数组指针逻辑
c语言·开发语言·算法