• esp32 nvs set_blob


    关注 码龄 粉丝数 原力等级 -- 被采纳 被点赞 采纳率 avenlee2023 2024-03-27 13:52 采纳率: 2.6% 浏览 2 首页/ 嵌入式 / esp32 nvs set_blob 单片机mcuvscode vscode + idf +esp32,如何使用nvs存储一下结构体temp_curve数值.set_blob吗 typedef struct{ uint16_t type; uint16_t temper1; uint16_t temper2; uint16_t temper3; uint16_t temper4; uint16_t temper5; uint16_t temper6; uint16_t temper7; uint16_t temper8; }Curve_Tab; typedef struct{ uint16_t curveflag; uint16_t nodes_num; Curve_Tab tab[20]; }Temp_Curve; Temp_Curve temp_curve; 收起 写回答 好问题 0 提建议 追加酬金 关注问题 微信扫一扫 点击复制链接 分享 邀请回答 编辑 收藏 删除 结题 收藏 举报 追加酬金 (90%的用户在追加酬金后获得了解决方案) 当前问题酬金 ¥ 0 (可追加 ¥500) ¥ 15¥ 20¥ 50¥ 100¥ 200 支付方式 扫码支付 二维码出错 点击刷新 支付金额 15 元 提供问题酬金的用户不参与问题酬金结算和分配 支付即为同意 《付费问题酬金结算规则》 结题 再想想 删除 再等等

    1条回答 默认 最新

    • 码农阿豪 Java领域优质创作者 2024-03-27 13:52
      关注
      让阿豪来帮你解答,本回答参考chatgpt3.5编写提供,如果还有疑问可以评论或留言
      首先,需要在工程中添加nvs库的依赖,这可以在CMakeLists.txt文件中添加以下代码进行实现:
      idf_component_register(SRCS "src/main.c"
                             INCLUDE_DIRS "." 
                             REQUIRES nvs_flash)
      

      接下来,需要初始化nvs_flash,并打开一个存储空间。这可以在main.c文件中按以下步骤进行实现: 1. 以"temp_curve"作为键创建一个nvs句柄。 2. 检查之前是否已经存储了一个temp_curve。如果有,从内存中取出。 3. 如果没有先初始化结构体。

      #include "nvs_flash.h"
      #include "nvs.h"
      #define TEMP_CURVE_STORAGE_NAMESPACE "storage"
      void init_temp_curve(void)
      {
          nvs_handle my_handle;
          esp_err_t err;
          size_t required_size;
          // 打开存储空间
          err = nvs_flash_init_partition(TEMP_CURVE_STORAGE_NAMESPACE);
          if (err != ESP_OK) {
              printf("Error (%s) opening NVS handle!\n", esp_err_to_name(err));
              return;
          }
          printf("NVS flash init\n");
          // 打开一个存储句柄
          err = nvs_open_from_partition(TEMP_CURVE_STORAGE_NAMESPACE, "temp_curve", NVS_READWRITE, &my_handle);
          if (err != ESP_OK) {
              printf("Error (%s) opening NVS handle m!\n", esp_err_to_name(err));
              return;
          }
          printf("NVS flash open success.\n");
          // 检查之前是否已经存储一个temp_curve
          err = nvs_get_blob(my_handle, "temp_curve", NULL, &required_size);
          if (err == ESP_OK) {
              // 如果已经存储一个temp_curve,则从内存中读取
              printf("Reading temp_curve from NVS ...\n");
              err = nvs_get_blob(my_handle, "temp_curve", &temp_curve, &required_size);
              if (err != ESP_OK) {
                  printf("Error (%s) reading!\n", esp_err_to_name(err));
                  return;
              }
          } else {
              // 如果之前没有存储一个temp_curve,则初始化一个
              printf("No temp_curve in NVS ... initiliazing!\n");
              temp_curve.curveflag = 0;
              temp_curve.nodes_num = 0;
              for (int i = 0; i < 20; i++) {
                  temp_curve.tab[i].type = 0;
                  temp_curve.tab[i].temper1 = 0;
                  temp_curve.tab[i].temper2 = 0;
                  temp_curve.tab[i].temper3 = 0;
                  temp_curve.tab[i].temper4 = 0;
                  temp_curve.tab[i].temper5 = 0;
                  temp_curve.tab[i].temper6 = 0;
                  temp_curve.tab[i].temper7 = 0;
                  temp_curve.tab[i].temper8 = 0;
              }
              // 将初始化的temp_curve存储到nvs中
              err = nvs_set_blob(my_handle, "temp_curve", &temp_curve, sizeof(temp_curve));
              if (err != ESP_OK) {
                  printf("Error (%s) storing!\n", esp_err_to_name(err));
                  return;
              }
              printf("New temp_curve stored in NVS!\n");
          }
          // 提交更改
          err = nvs_commit(my_handle);
          if (err != ESP_OK) {
              printf("Error (%s) committing!\n", esp_err_to_name(err));
          }
          // 关闭存储句柄
          nvs_close(my_handle);
      }
      

      最后,在需要更新或读取temp_curve结构体的地方,可以通过nvs库的函数实现。例如,写入temp_curve结构体:

      nvs_flash_init_partition(STORAGE_NAMESPACE);
      // 打开存储空间
      nvs_handle my_handle;
      esp_err_t err = nvs_open_from_partition(STORAGE_NAMESPACE, "temp_curve", NVS_READWRITE, &my_handle);
      if (err != ESP_OK) {
          printf("Error (%s) opening NVS handle!\n", esp_err_to_name(err));
          return;
      }
      // 写入temp_curve结构体
      err = nvs_set_blob(my_handle, "temp_curve", &temp_curve, sizeof(temp_curve));    
      // 提交更改
      err = nvs_commit(my_handle);    
      nvs_close(my_handle);
      

      读取temp_curve结构体:

      nvs_flash_init_partition(STORAGE_NAMESPACE);
      // 打开存储空间
      nvs_handle my_handle;
      esp_err_t err = nvs_open_from_partition(STORAGE_NAMESPACE, "temp_curve", NVS_READWRITE, &my_handle);
      if (err != ESP_OK) {
          printf("Error (%s) opening NVS handle!\n", esp_err_to_name(err));
          return;
      }
      // 读取temp_curve结构体
      err = nvs_get_blob(my_handle, "temp_curve", &temp_curve, &required_size);
      nvs_close(my_handle);
      

      需要注意的是,存储空间的大小有限制,如果存储的结构体过大,则可能会存储失败。

      展开全部

      评论
      编辑
      预览

      报告相同问题?

    • 相关阅读:
      数据在内存中的存储
      java反射与注解详解,共同实现动态代理模式
      高斯过程的数学理解
      [附源码]Python计算机毕业设计Django教务管理系统
      如何发布一个 NPM 包
      共享WiFi贴项目可以带来哪些优势?
      十 动手学深度学习v2 ——卷积神经网络之NiN + GoogLeNet
      numpy矩阵补全函数 np.pad()
      9.1 DEP机制的保护原理
      7.20 - 每日一题 - 408
    • 原文地址:https://ask.csdn.net/questions/8079745