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
相关产品推荐
相关产品推荐

