乐鑫技术交流
直播中

王辉

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

nvs_get_str读数据串经常失败的原因?

版本V5.0.1,我利用了NVS保存了WiFI的密码和账号,但是我发现经常读不成功地。我看了一下例程,我发现例程只是读某一个BYTE的数据,nvs_get_u8 例如这个读BYTE的接口,是正确的。多次读写都容易成功。但是利用 nvs_get_str 这个读字符串,经常读不出来的,会经常报一个错误 (ESP_ERR_NVS_INVALID_LENGTH)。但是神奇的是,我只要在读前面加上判断,利用printf输出某些信息,然后调用 nvs_get_str 就能读成功,估计这个接口有BUG。你们可以试试。(PS:我曾经尝试在读之前加了延时函数。发现没什么用。)
esp_err_t err;
  err = nvs_open("storage", NVS_READWRITE, &my_handle);   
if( err != ESP_OK )
       printf("Error (%s) opening NVS handle!n", esp_err_to_name(err));
    else
       printf("Flash_Write_str open flash succes.n");
                                                                                                                                                                        Last edited by ming191 on Fri Apr 07, 2023 1:30 am, edited 1 time in total.                                                                        
                                                                                                                                               

回帖(1)

回头太晚

2024-6-12 16:23:58
根据您提供的信息,您在使用 ESP-IDF 的 NVS 组件时遇到了 nvs_get_str 函数读取字符串数据失败的问题。这个问题可能是由以下几个原因导致的:

1. **数据未正确写入**:在使用 nvs_set_str 写入字符串时,可能由于某些原因(如写入过程中的异常、电源问题等)导致数据未正确写入 NVS。

2. **数据损坏**:NVS 存储的数据可能因为硬件故障、电源问题等原因而损坏。

3. **读取参数错误**:在使用 nvs_get_str 时,可能传入了错误的参数,如长度参数不正确。

4. **内存问题**:ESP32 的内存可能不足以存储大量数据,导致数据读取失败。

5. **软件BUG**:您提到的“估计这个接口有BUG”,这是一个可能性,但需要进一步验证。

为了解决这个问题,您可以尝试以下方法:

1. **确保数据正确写入**:在写入数据后,立即读取并验证数据是否正确。

2. **检查硬件和电源**:确保硬件和电源稳定,避免数据损坏。

3. **使用合适的参数**:在使用 nvs_get_str 时,确保传入的参数正确,特别是长度参数。

4. **增加内存管理**:检查您的应用程序是否占用了大量内存,尝试优化内存使用。

5. **更新ESP-IDF版本**:您当前使用的是 V5.0.1 版本,可以尝试升级到较新的版本,看看问题是否得到解决。

6. **调试和日志**:在读取数据前后添加调试信息和日志输出,以便更好地了解问题所在。

7. **联系ESP-IDF社区**:如果问题仍然存在,您可以联系 ESP-IDF 社区或提交一个 issue,以便开发者能够了解并解决这个问题。

最后,您提到的“在读前面加上判断,利用printf输出某些信息,然后调用 nvs_get_str 就能读成功”,这可能是由于某些外部因素(如硬件状态、内存状态等)在执行 printf 后发生了变化,导致 nvs_get_str 成功读取数据。但这并不是一个可靠的解决方案,建议您按照上述方法进行排查和解决。
举报

更多回帖

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