当前位置: 首页 > backend >正文

ESP32C3在ESP-IDF中的nvs操作

好记心不如烂笔头

代码

/*** @brief nvs初始化*/
void nvs_init();/*** @brief     nvs读取数据 字符串* @param mingMingKongJIanI8P  命名空间* @param key  键名* @param strSZP 保存读取字符串的数组(缓冲区)* @param max_size 数组(缓冲区)长度* @return*      成功: ESP_OK*      失败: 其他错误代码**/
esp_err_t nvs_du_qu_str(const char *mingMingKongJIanI8P, const char *key, char *strSZP, size_t max_size);/*** @brief     nvs保存数据 字符串* @param mingMingKongJIanI8P  命名空间* @param key  键名* @param strSZP 要保存的字符串* @return*      成功: ESP_OK*      失败: 其他错误代码**/
esp_err_t nvs_tian_jia_str(const char *mingMingKongJIanI8P, const char *key, const char *str);void nvs_init()
{esp_err_t err = nvs_flash_init();if (err == ESP_ERR_NVS_NO_FREE_PAGES || err == ESP_ERR_NVS_NEW_VERSION_FOUND){// NVS分区被截断,需要擦除重试nvs_flash_initESP_ERROR_CHECK(nvs_flash_erase());err = nvs_flash_init();}ESP_ERROR_CHECK(err);
}
esp_err_t nvs_du_qu_str(const char *mingMingKongJIanI8P, const char *key, char *strSZP, size_t max_size)
{nvs_handle_t my_handle;esp_err_t err;size_t len = 0;// Openerr = nvs_open(mingMingKongJIanI8P, // 命名空间名称NVS_READWRITE,       // NVS_READWRITE 或 NVS_READONLY。如果 NVS_READONLY,将打开一个只读句柄。&my_handle);         // 如果成功(返回代码为零),句柄将在此参数中返回。if (err != ESP_OK){ESP_LOGI(TAG, "err ==  1\n");nvs_close(my_handle);return err;}/*这个是获取要获取的字符串长度,包含终止符'\0'*/err = nvs_get_str(my_handle, key, NULL, &len); // 指向输出值的指针。nvs_get_str 和 nvs_get_blob 可能为 NULL,在这种情况下,所需的长度将在长度参数中返回,包含'\0'。if (err != ESP_OK){ESP_LOGI(TAG, "err ==  2\n");nvs_close(my_handle);return err;}// 检查目标缓冲区大小是否足够if (len > max_size){ESP_LOGE(TAG, "目标缓冲区太小(需要 %zu 字节,提供 %zu 字节)", len, max_size);nvs_close(my_handle);return ESP_ERR_INVALID_SIZE;}char *run_time = malloc(len); // malloc 动态分配内存if (run_time == NULL){ESP_LOGE(TAG, "内存分配失败");nvs_close(my_handle);return ESP_ERR_NO_MEM;}/*这个是获取指定长度的字符串*/err = nvs_get_str(my_handle, key, run_time, &len); // 指向输出值的指针。nvs_get_str 和 nvs_get_blob 可能为 NULL,在这种情况下,所需的长度将在长度参数中返回。if (err != ESP_OK){ESP_LOGI(TAG, "err ==  3\n");free(run_time);nvs_close(my_handle);return err;}// 将动态分配的字符串复制到传入的缓冲区(数组,传入数组要加上'\0'的位置)for (size_t i = 0; i < len; i++){strSZP[i] = run_time[i];}// ESP_LOGI(TAG, "strSZP ==  %s\n", strSZP);free(run_time); // 释放分配的动态内存// 关闭存储句柄并释放所有分配的资源nvs_close(my_handle);return ESP_OK;
}esp_err_t nvs_tian_jia_str(const char *mingMingKongJIanI8P, const char *key, const char *str)
{nvs_handle_t my_handle;esp_err_t err;// Openerr = nvs_open(mingMingKongJIanI8P, // 命名空间名称NVS_READWRITE,       // NVS_READWRITE 或 NVS_READONLY。如果 NVS_READONLY,将打开一个只读句柄。&my_handle);         // 如果成功(返回代码为零),句柄将在此参数中返回。if (err != ESP_OK){nvs_close(my_handle);return err;}err = nvs_set_str(my_handle, key, str); // 指向输出值的指针。nvs_get_str 和 nvs_get_blob 可能为 NULL,在这种情况下,所需的长度将在长度参数中返回。if (err != ESP_OK && err != ESP_ERR_NVS_NOT_FOUND){nvs_close(my_handle);return err;}//  承诺书面价值。设置任何值后,必须调用 nvs_commit() 以确保更改写入闪存。//  实现可能会在其他时间写入存储,但这不能保证。err = nvs_commit(my_handle);if (err != ESP_OK){nvs_close(my_handle);return err;}// 关闭存储句柄并释放所有分配的资源nvs_close(my_handle);return ESP_OK;
}

其他的以后用到在补充

http://www.xdnf.cn/news/7080.html

相关文章:

  • Django 项目创建全攻略
  • R for Data Science(3)
  • oppo手机安装APK失败报错:安装包异常
  • 常见的数据库问题
  • Binary Prediction with a Rainfall Dataset-(回归+特征工程+xgb)
  • 【C++进阶篇】C++容器完全指南:掌握set和map的使用,提升编码效率
  • Popeye
  • UnLua源码分析(一)初始化流程
  • 13.Ext系列文件系统
  • 【2025版】SpringCloud Gateway网关快速入门
  • 相机Camera日志分析之十二:高通相机Camx hal拍照1帧logcat日志capture拍照帧详解
  • 基于CNN的猫狗识别(自定义CNN模型)
  • AIDA64 extreme7.5 版本注册激活方法
  • 掌握LINQ:查询语法与方法语法全解析
  • 什么是 Flink Pattern
  • 内容中台的AI基石是什么?
  • TDengine 在新能源领域的价值
  • 前端动画库 Anime.js 的V4 版本,兼容 Vue、React
  • OpenHarmony外设驱动使用 (四),Face_auth
  • 蓝牙通讯协议学习
  • 内容社区系统开发文档(中)
  • 继MCP、A2A之上的“AG-UI”协议横空出世,人机交互迈入新纪元
  • windows环境下c语言链接sql数据库
  • Kubernetes控制平面组件:Kubelet详解(六):pod sandbox(pause)容器
  • JSON Schema 高效校验 JSON 数据格式
  • 微服务项目->在线oj系统(Java版 - 2)
  • c++编写中遇见的错误
  • 【AWS入门】Amazon SageMaker简介
  • 4:OpenCV—保存图像
  • 解决 Tailwind CSS 代码冗余问题