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_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;
}


其他的以后用到在补充

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值