ESP32-WROOM(16MB Flash)读取NVS存储值失败,报错ESP_ERR_NVS_NOT_FOUND(0x1102/4354)
ESP32 NVS写入后读取失败(ESP_ERR_NVS_NOT_FOUND)排查与解决
先看你的问题场景:你使用搭载16MB Flash的ESP32-WROOM开发板,执行NVS写入操作后无法读取对应值,返回错误码4354(ESP_ERR_NVS_NOT_FOUND)。所有前置操作(分区初始化、打开命名空间、写入、提交)都返回成功,且分区表配置、操作模式(NVS_READWRITE)都符合要求。
你的测试代码与配置
测试代码(格式化后):
esp_err_t ret = 0; nvs_handle handler = 0; ret = nvs_flash_init_partition("nvs"); log_e("nvs_flash_init_partition CODE: %d", ret); delay(500); ret = nvs_open_from_partition("nvs", "tele", NVS_READWRITE, &handler); log_e("nvs_open CODE: %d", ret); delay(500); ret = nvs_set_u8(handler, "kk", 7); log_e("nvs_set_u8 CODE: %d", ret); delay(500); ret = nvs_commit(handler); log_e("nvs_commit CODE: %d", ret); delay(500); int8_t max_buffer_size = 256; ret = nvs_get_i8(handler, "kk", &max_buffer_size); log_e("nvs_get_u8 CODE: %d", ret); log_e("nvs_get_u8 STORED: %d", max_buffer_size); delay(500); ret = nvs_flash_deinit_partition("nvs"); log_e("nvs_flash_deinit_partition CODE: %d", ret); nvs_close(handler);
分区表配置:
# Espressif ESP32 Partition Table # Name, Type, SubType, Offset, Size, Flags nvs,data,nvs,0x9000,16K, otadata,data,ota,0xd000,8K, phy_init,data,phy,0xf000,4K, factory,app,factory,0x10000,8M, ota_0,app,ota_0,0x810000,1M, ota_1,app,ota_1,0x910000,1M,
代码中的小细节提醒
注意到你用nvs_set_u8写入无符号8位整数,但读取时用了nvs_get_i8(有符号8位整数)。虽然两者字节长度相同,但NVS会为每个键存储类型标识,类型不匹配理论上会返回ESP_ERR_NVS_TYPE_MISMATCH(错误码4353),而非NOT_FOUND,所以这不是当前问题的直接原因,但建议后续统一类型操作,避免潜在问题。
核心原因:Flash物理损坏
从你的更新来看,更换开发板后代码运行正常,这说明原开发板的Flash存在物理损坏:
- 尽管NVS写入和提交操作返回成功,但数据并未真正写入到Flash的NVS分区(可能对应区域存在坏块)
- 读取时NVS无法在分区中找到对应的键值记录,因此返回
ESP_ERR_NVS_NOT_FOUND
后续类似问题的排查建议
如果再遇到此类情况,可以尝试:
- 擦除NVS分区:使用
esptool.py erase_region 0x9000 0x4000(对应你的分区偏移和大小),重新测试 - 检查Flash状态:通过ESP-IDF的
esp_flash_get_chip_info、esp_flash_get_size接口确认Flash的实际容量与健康状态 - 验证分区表:确保编译时使用的分区表与配置一致,避免分区重叠或配置错误导致异常
内容的提问来源于stack exchange,提问作者SXN
相关产品推荐
相关产品推荐

