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;
}
其他的以后用到在补充