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

FatFS SD卡文件写入异常:写入内容为全0值的问题排查

更新说明

以下代码实际可正常运行。经排查,问题出在后续用于与设备交互、下载文件的软件上。将SD卡直接从设备拔出并插入电脑后,发现文件中实际已有数据。

这又是一个典型的“想当然”导致的问题,永远不要想当然:)
保留此帖,供遇到同类问题的开发者参考。


问题:FatFS写入SD卡的文件仅含二进制0数据

我正在开发一个日志程序,需在设备SD卡上创建文件并写入数据。目前仅尝试向日志文件写入文本“hello123”,但将文件从卡中下载后,用文本编辑器打开时无ASCII数据,仅包含二进制数据(一系列^@字符)。

文件可正常创建,仅写入环节存在问题。该函数在设备固件的另一个日志函数之后调用,因此可认为SD卡已挂载,SD的CS引脚处于有效电平(实际为低电平,引脚为反相逻辑)。

事件流程

  • 程序启动
  • 主日志函数调用,选中SD线路
  • 我的日志函数被调用
  • 创建DEBUG.LOG文件
  • 写入并关闭DEBUG.LOG文件
  • 程序继续运行

所用的f_系列函数属于FatFS库。

代码实现

#include <ff.h>
#include <stdio.h>
#include <string.h>
#include "main.h"

unsigned char filename[10] = "debug.log";
unsigned char line[360];
static FIL logFile;
unsigned char error = 0;
FRESULT fresult;
UINT written = 0;
FATFS fatfs[1];

void writeLog()
{
    volatile unsigned char retVal;
    memset(line, 0, sizeof(line));
    
    // 检查SD卡是否挂载
    if(f_mount(&fatfs[0], "0:", 1) != FR_OK)
    {
        error = 1; // 断点调试用
    }
    else
    {
        if(f_open(&logFile, (const char*)filename, FA_CREATE_ALWAYS | FA_WRITE) == FR_OK){
            retVal = f_lseek(&logFile, f_size(&logFile));

            line[0] = 'h';
            line[1] = 'e';
            line[2] = 'l';
            line[3] = 'l';
            line[4] = 'o';
            line[5] = '1';
            line[6] = '2';
            line[7] = '3';
            line[8] = 0x00;
            f_puts((char const*)line, &logFile) ;
            f_puts("\r\n", &logFile);
            f_sync(&logFile);
            retVal = f_close(&logFile);
        }
    }
}

问题现象

我无法理解为何文件写入失败。文件大小显示为8字节,但在Ubuntu终端用less查看时,显示为^@^@^@^@^@^@^@^@^@^@。

十六进制dump结果:

$ xxd DEBUG.LOG
00000000: 0000 0000 0000 0000 0000                 ..........

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 08:47:43