ESP idf 框架下 SD 文件保存失败原因分析

调试的时候发现,只要文件名称超过 8 个字符,保存就会报错

// 初始化SD卡
sd_storage_init();

// // 文件操作示例
const char *file_path = "/sdcard/maintestttttttttt.txt";
const char *data = "Hello, SD Card!!!!";

// 写入文件
if (sd_storage_write_file(file_path, data) == ESP_OK) {
    ESP_LOGI("MAIN", "File written successfully");
}

查询原因后发现是 ESP-IDF 中使用 FAT 文件系统(SD 卡通常格式化为 FAT32)时,文件名被自动转换为大写是 FAT 文件系统本身的特性

FAT 文件系统的设计限制:

  • FAT12/FAT16/FAT32 文件系统最初设计于 DOS 时代,采用 8.3 文件名格式(8 字符主名 + 3 字符扩展名)
  • 这些文件系统不区分大小写,且默认将所有文件名存储为大写
  • 这是 FAT 文件系统的标准行为,在所有操作系统(Windows/Linux/macOS)上表现一致

ESP-IDF 的 FATFS 实现 使用 FATFS 库(由 ChaN 开发)处理 FAT 文件系统:

  • 默认配置下,FATFS 会:
  • 自动将文件名转换为大写
  • 截断长文件名至 8.3 格式
  • 移除非法字符(如 *?:<>| 等)

启用长文件名支持(LFN)

在 menuconfig 中配置:

idf.py menuconfig

Component config → FAT Filesystem support →

Long filename support

  • ( ) Long filename buffer in heap
    
  • (X) Long filename buffer in stack  # 推荐选择栈分配
    
  • (255) Max long filename length
    

image

开启后一切就正常了

posted @ 2025-07-10 16:19  口嗨养生博  阅读(57)  评论(0)    收藏  举报