配置FatFs并批量写入txt文件

本文详细介绍了如何使用FatFs文件系统进行SD卡的基本操作,包括文件系统的加载、目录的创建、文件的创建与写入等步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

继上一篇文章连接好FatFs与SD卡后,这里开始介绍如何配置操作FatFs。

第一步、建立文件系统和文件结构变量,相当于为文件系统以及文件开辟一个实体,如下图

第二步、加载文件系统(Mount or Unmount),这里需要调用f_mount函数,函数格式如下

FRESULT f_mount (
FATFS* fs, /* Pointer to the file system object (NULL:unmount)*/
const TCHAR* path,/* Logical drive number to be mounted/unmounted */
BYTE opt /* 0:Do not mount (delayed mount), 1:Mount immediately */
)

fs为所要加载的文件系统结构指针,在第一步已经定义过了。

path相当于你加载的磁盘符,这里默认为"0:/",也就是磁盘符为0.

opt是加载选项,这里设置为1,立即加载。

当其返回FR_OK时,说明加载成功,其他一些返回状态见ff.h,这里不再列举了

然后调用f_mount函数即可,如下图

第三步、加载好文件系统后,下面就可以操作文件系统了,在创建文件之前,我先创建个路径(其实路径也可以不用创建,那样的话就在跟目录下了)

创建目录需要调用f_mkdir函数,函数格式如下

FRESULT f_mkdir (
const TCHAR* path/* Pointer to the directory path */
)

其只有一个参数path,为指向所创建目录的指针。

同样,其返回FR_OK说明创建成功

调用f_mkdir函数,如下图

其中,文件夹格式为年_月,文件名格式日_时。

第四步、文件夹路径创建好后,就可以创建文件了,文件系统通过f_open函数来创建文件,函数其格式如下

FRESULT f_open (
FIL* fp, /* Pointer to the blank file object */
const TCHAR* path,/* Pointer to the file name */
BYTE mode /* Access mode and file open mode flags */
)

其中fp为文件结构指针,在第一步中已经建立

path为文件路径,这里需要注意,这里的文件路径必须要包含之前文件夹名以及文件名,例如我想在16_12文件夹中创建15_13文件,需要将路径赋值为

"0:/16_12/15_13.txt",如果该路径只加文件名的话,还是会将文件创建在根目录下的

参数mode为操作选项,我们这里赋值为FA_WRITE | FA_OPEN_ALWAYS表示以写的方式打开或创建文件,如果文件存在,则打开,如果文件不存在则创建。

调用该函数如果返回FR_OK,则说明文件打开成功。

第五步、向文件中写入数据,直接调用f_write函数即可,函数格式如下

FRESULT f_write (
FIL* fp, /* Pointer to the file object */
const void *buff,/* Pointer to the data to be written */
UINT btw, /* Number of bytes to write */
UINT* bw /* Pointer to number of bytes written */
)

其中fp为文件结构指针

buff为写入数据缓冲区

btw为写入数据长度

bw为btw的指针

调用过程如下

f_lseek(fil,fil->fsize); 
Sd_Fat_Data.File_Wt_Flg = f_write(fil, Sd_Fat_Data.BMS_Str_Buffer, index, &bw);

我这里的数据比较长,就不截图了。有一点注意的是,在多次重复写入一个文件前,需要调用一下f_lseek(fil,fil->fsize); 其作用就是定位到你要写入的文件的末端,这样写入的数据才不会覆盖文件原有的数据。

第六步、文件写好后,如果不想继续操作,就可以关闭文件并卸载文件系统工作区间了

f_close(&Fil);
f_mount(NULL,"0:/",1); 

注:在测试过程中遇到的问题现象

1、我在实际应用中是每500ms向文件中写2000字节左右的数据,刚开始操作是每写一次文件前打开文件,写好后再关闭文件。

      后来经测试发现,在连续几十小时写入文件没有出现任何错误的情况下(打开或写入文件出错的情况下向上位机发送标识),SD卡文件夹中出现了很多莫名其妙的文件,在电脑端打不开也删不了。出现这种问题实在是找不出原因,所以究其根本,既然是出现了很多乱七八糟的文件,那应该是在打开文件的时候,文件路径指针指飞的原因。

后来改进了自己的方法,因为我的系统是按小时来更新文件,如下图

于是我在每次建立一个新文件后,只打开该文件一次,并且只在达到需要建立下一个文件的条件时才关闭该文件,至于存储过程中文件如何更新,则改成调用f_sync(&Fil); 

也就是避免了最初的频繁调用open及close函数。后来经几天几夜的测试,之前乱七八糟文件出现的现象没有了,文件的写入也很正常。下图是我写的文件

至此,我的批量存储功能已经完成,文中如有不合理的地方,也请大家指正。

03-25
### FatFs 嵌入式文件系统使用说明 FatFs 是一种专为小型嵌入式系统设计的通用 FAT/exFAT 文件系统模块,其核心特点在于高度可移植性和低资源消耗。以下是关于 FatFs 的主要功能及其常见问题解决方案: #### 1. 功能概述 FatFs 支持多种配置选项以适应不同的应用需求。这些特性包括但不限于: - **DOS/Windows 兼容性**:支持 FAT12、FAT16 和 FAT32 文件系统[^4]。 - **长文件名支持**:可以处理 ANSI/OEM 或 Unicode 格式的长文件名。 - **多线程安全性**:适用于实时操作系统 (RTOS),能确保线程安全的操作环境。 - **大容量存储支持**:通过 exFAT 文件系统扩展支持高达 ZB 级别的存储设备。 #### 2. 初始化流程 为了在嵌入式平台上成功部署 FatFs,通常需要完成以下几个关键步骤: - 配置 `ffconf.h` 文件中的宏定义来适配具体的应用场景和硬件条件。 - 实现底层磁盘 I/O 接口函数 (`disk_initialize`, `disk_read`, `disk_write`, `disk_ioctl`) 来桥接具体的硬件接口(如 SD 控制器或 USB 存储设备)[^5]。 ```c #include "ff.h" // 定义全局变量 FRESULT 表示返回状态码 FRESULT fr; FIL fil; // 文件对象声明 fr = f_mount(&fs, "", 0); // 将逻辑驱动挂载至文件系统实例 fs 上 if (FR_OK != fr) { // 处理错误情况 } ``` 上述代码片段展示了如何利用 `f_mount()` 函数将指定的逻辑驱动关联到特定的工作区域中[^3]。 #### 3. 错误排查指南 当遇到与 FatFs 相关的技术难题时,可以从以下几个方面入手分析原因采取相应措施解决问题: - 如果发现无法正常访问某些路径下的数据,则需确认当前工作目录设置是否正确以及是否存在权限限制等问题; - 当频繁触发超时中断提示时,应仔细检查所连接外部存储介质的状态参数表(Status Register),排除因信号质量差而导致的数据传输失败风险; #### 4. 示例代码展示 下面给出一段简单的例子演示怎样打开一个已存在的文本文件进行追加写入操作: ```c UINT bw; fr = f_open(&fil, "TEST.TXT", FA_OPEN_APPEND | FA_WRITE); if (FR_OK == fr){ const char* msg = "Hello World!\r\n"; fr = f_write(&fil, msg, strlen(msg), &bw); if ((FR_OK == fr) && (strlen(msg) == bw)){ /* 数据成功写入 */ } f_close(&fil); } else{ /* 打开文件失败 */ } ``` 此段程序首先尝试以附加模式开启名为 TEST.TXT 的文档,接着向其中添加字符串内容最后关闭该流句柄结束整个过程。 ---
评论 21
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值