好记心不如烂笔头
代码
/**
* @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_init
ESP_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;
// Open
err = 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;
// Open
err = 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;
}
其他的以后用到在补充