完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
我想利用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 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 } 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};//重点 重启后,读取出现乱码!!求帮助,困扰好长时间了。 |
|
相关推荐
1个回答
|
|
首先,我们需要了解ESP32-S2的NVS(Non-Volatile Storage)是一种用于存储小量数据的非易失性存储解决方案。在这种情况下,您希望使用NVS存储WiFi列表,但是遇到了乱码问题。以下是一些建议来解决这个问题:
1. **确保使用正确的编码**:在存储和读取数据时,确保您的代码使用相同的字符编码。通常,UTF-8编码是一个不错的选择。 2. **使用C字符串**:在您的结构体中,您使用了`char *ssid`和`char *password`。这可能导致内存分配和释放的问题。建议您使用固定长度的字符数组,例如: ```c typedef struct _wifi_conf { char ssid[32]; char password[64]; } wifi_conf_struct; ``` 3. **确保NVS键名唯一**:在存储和读取数据时,确保每个WiFi配置都有一个唯一的键名。例如,您可以使用WiFi列表的索引作为键名的一部分。 4. **使用合适的NVS API**:在存储和读取数据时,确保使用正确的NVS API。例如,使用`nvs_set_blob`和`nvs_get_blob`来存储和读取二进制数据。 5. **检查数据存储和读取过程**:确保在存储和读取数据时,数据的大小和类型都正确。例如,在使用`nvs_set_blob`时,确保传递的数据大小与结构体的大小相匹配。 6. **调试和错误处理**:在存储和读取数据时,添加适当的调试信息和错误处理。这将帮助您更容易地找到问题所在。 7. **使用示例代码**:以下是使用NVS存储和读取WiFi配置的示例代码: ```c #include "nvs_flash.h" #include "nvs.h" #define WIFI_CONF_NAMESPACE "wifi_conf" void save_wifi_conf(const wifi_conf_struct *wifi_conf, const char *key) { esp_err_t ret; nvs_handle_t handle; ret = nvs_open(WIFI_CONF_NAMESPACE, NVS_READWRITE, &handle); if (ret == ESP_OK) { size_t size = sizeof(wifi_conf_struct); ret = nvs_set_blob(handle, key, wifi_conf, size); nvs_close(handle); } } wifi_conf_struct load_wifi_conf(const char *key) { wifi_conf_struct wifi_conf; esp_err_t ret; nvs_handle_t handle; size_t size = sizeof(wifi_conf_struct); ret = nvs_open(WIFI_CONF_NAMESPACE, NVS_READONLY, &handle); if (ret == ESP_OK) { ret = nvs_get_blob(handle, key, &wifi_conf, &size); nvs_close(handle); } return wifi_conf; } ``` 通过遵循这些建议,您应该能够解决在使用ESP32-S2的NVS存储WiFi列表时遇到的乱码问题。 |
|
|
|
只有小组成员才能发言,加入小组>>
1083 浏览 1 评论
569浏览 6评论
475浏览 5评论
有没有办法在不使用混杂模式的情况下实现Wifi驱动程序接收缓冲区访问中断呢?
458浏览 5评论
459浏览 4评论
430浏览 4评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-13 01:27 , Processed in 0.795703 second(s), Total 81, Slave 62 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号