You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Arduino温度记录站SD卡文件写入失败问题排查求助

问题定位与解决方案:RTC 1307 + Arduino温度记录站文件名创建异常

核心排查方向

  • 时间戳格式合法性检查
    DS1307返回的时间格式(如年、月、日是否为十进制、是否带前导零)可能触发SD卡FAT32文件系统的文件名限制——不能包含/ \ : * ? " < > |,8.3短文件名模式下主名最多8字符、扩展名最多3字符。
    直接打印生成的文件名到串口验证:

    String fileName = "LOG_" + String(year) + "_" + String(month) + "_" + String(day) + ".txt";
    Serial.print("Generated filename: ");
    Serial.println(fileName);
    
  • 目录检测逻辑修正
    SD.exists()的检测对象需明确:检测文件传完整文件名(如/LOGS/2024_05_20.txt),检测目录需路径以/结尾(如/LOGS/)。同时建议先创建子目录再写入文件,避免根目录文件数量超限(FAT32根目录最多512个文件):

    if (!SD.exists("/LOGS")) {
      SD.mkdir("/LOGS");
    }
    File logFile = SD.open("/LOGS/" + fileName, FILE_WRITE);
    
  • RTC时间有效性验证
    DS1307初始化后需确认时间已正确写入,否则可能返回默认值(如2000年1月1日),导致文件名重复或格式异常。初始化后立即读取并打印时间:

    DateTime now = rtc.now();
    Serial.print("Current RTC time: ");
    Serial.print(now.year(), DEC);
    Serial.print('/');
    Serial.print(now.month(), DEC);
    Serial.print('/');
    Serial.println(now.day(), DEC);
    
  • 文件打开错误细节排查
    调用SD.open()后必须检查返回值,同时打印SD卡状态辅助定位:

    File logFile = SD.open(fileName, FILE_WRITE);
    if (!logFile) {
      Serial.print("Failed to open file: ");
      Serial.println(fileName);
      Serial.print("SD card type: ");
      Serial.println(SD.cardType());
    } else {
      // 执行写入操作
      logFile.close();
    }
    

    SD.cardType()返回值(CARD_NONE/CARD_MMC/CARD_SD/CARD_SDHC)可确认SD卡是否被正确识别。

常见代码误区修正

  • 替换String拼接文件名的方式,改用字符数组避免内存碎片化:

    char fileName[32];
    sprintf(fileName, "LOG_%04d_%02d_%02d.txt", now.year(), now.month(), now.day());
    
  • 确认引脚无冲突:DS1307用I2C引脚(A4/A5或SDA/SCL),SD卡模块用SPI引脚(D10-D13),CS引脚需单独配置(如const int chipSelect = 10;)。

内容的提问来源于stack exchange,提问作者mr_harm

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 00:22:35