乐鑫技术交流
直播中

王芳

8年用户 1481经验值
私信 关注
[问答]

esp32s2利用nvs存储blob出现乱码是怎么回事?如何解决?

我想利用NVS存储WiFi列表,定义了结构体如下:


typedef struct _wifi_conf wifi_conf_struct;


struct _wifi_conf


{


        char *ssid;


        char *password;


};





typedef struct  _wifi_conf_node_t wifi_conf_node_t;


struct _wifi_conf_node_t


{


        wifi_conf_struct item;


        wifi_conf_node_t *p;


};





typedef struct _wifi_conf_link_t wifi_conf_link_t;


struct _wifi_conf_link_t


{


        wifi_conf_node_t *np;


        int length;


};


NVS存储函数:


esp_err_t nvs_write_data_to_flash_in_main(wifi_conf_link_t *wifi_conf_list_link)


{


    //ESP_ERROR_CHECK(nvs_flash_erase());


    nvs_handle handle;





    size_t wifi_conf_size = 0;


    int list_cont = wifi_conf_list_link->length;


    struct _wifi_conf_node_t *tmp = wifi_conf_list_link->np;


    struct _wifi_conf wifi_conf_list[list_cont];


    int i = 0;


    while (i < list_cont)


    {


        wifi_conf_list = tmp->item;


        wifi_conf_size = wifi_conf_size + sizeof(tmp->item);


        tmp = tmp->p;


        i++;


    }


   





    ESP_ERROR_CHECK(nvs_open(NVS_CUSTOMER, NVS_READWRITE, &handle));





    ESP_ERROR_CHECK(nvs_set_i32(handle, DATA_KEY_2, list_cont));





    ESP_ERROR_CHECK(nvs_set_blob(handle, DATA_KEY_1, wifi_conf_list, wifi_conf_size));





    ESP_ERROR_CHECK(nvs_commit(handle));





    // free(wifi_conf_list);


    // free(tmp);





    printf("NVS_WRITE:存储wifi信息完毕n");


    nvs_close(handle);





    return ESP_OK;


}


NVS读取函数:


struct _wifi_conf_link_t nvs_read_data_from_flash_in_main(void)


{





struct _wifi_conf_link_t wifi_conf_list_link_read = {NULL, 0};





    nvs_handle handle;





    int32_t value = 0;





    esp_err_t err = nvs_open(NVS_CUSTOMER, NVS_READWRITE, &handle);


    if (err != ESP_OK)


    {


        printf("Error (%s) opening NVS handle!n", esp_err_to_name(err));


    }


    else


    {


        printf("Donen");





        // Read


        printf("Reading restart counter from NVS ... ");





        err = nvs_get_i32(handle, DATA_KEY_2, &value);


        switch (err)


        {


        case ESP_OK:


            printf("Donen");


            printf("Restart counter = %dn", value);


            break;


        case ESP_ERR_NVS_NOT_FOUND:


            printf("The value is not initialized yet!n");


            break;


        default:


            printf("Error (%s) reading!n", esp_err_to_name(err));


        }


    }


    if (value == 0)


    {


        return wifi_conf_list_link_read;


    }





    struct _wifi_conf wifi_conf_list[value];





    size_t required_size = 0; // value will default to 0, if not set yet in NVS


    nvs_get_blob(handle, DATA_KEY_1, NULL, &required_size);





    ESP_ERROR_CHECK(nvs_get_blob(handle, DATA_KEY_1, &wifi_conf_list, &required_size));





    nvs_close(handle);





   





    for (int i = 0; i < value; i++)


    {


        wifi_conf_link_add(&wifi_conf_list_link_read, wifi_conf_list);


        //printf("%srn",wifi_conf_list.ssid);


    }


    return wifi_conf_list_link_read;


}





问题来了:


    wifi_conf_struct tmp = {"yangyanghome24", "abcd1234"};//重点





    wifi_conf_link_del_all(&m_wifi_conf_link_main);


    wifi_conf_link_add(&m_wifi_conf_link_main, tmp);





    nvs_write_data_to_flash(&m_wifi_conf_link_main);


重启后,NVS读取正常,但是:


                        const char* pwd_selected_const = lv_textarea_get_text(textarea_pswd);


                        int nLen = strlen(pwd_selected_const);


                        char* pCh = (char*)malloc(sizeof(pwd_selected_const));


                        memcpy(pCh, pwd_selected_const, nLen + 1);


wifi_conf_struct scan_seleced_wifi_conf = {"splite_ssid_",pCh};//重点


重启后,读取出现乱码!!求帮助,困扰好长时间了。

更多回帖

发帖
×
20
完善资料,
赚取积分