让阿豪来帮你解答,本回答参考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);
需要注意的是,存储空间的大小有限制,如果存储的结构体过大,则可能会存储失败。