STM32 SD-FatFS连续写入数据无效与解决方法 文档空白解决方法

在STM32项目中遇到使用FatFS库对SD卡进行连续写入时数据丢失或显示异常的问题,主要原因是f_open参数设置、未使用f_lseek进行指针偏移以及同步操作f_sync的缺失。解决方案包括使用f_lseek移动文件指针至末尾,结合f_printf进行写入,确保f_close保存数据,并在必要时使用FA_OPEN_EXISTING参数防止文件被覆盖。同时,使用f_sync或在f_close时同步数据可避免数据丢失。

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

STM32 SD-FatFS连续写入数据无效与解决方法 文档空白解决方法

引言:STM32下位机做毕设遇到这个问题,用FatFS对SD卡多次连续写入的时候,SD卡中内容是空的,或者是看不见的字符。我将遇到的问题和解决方法总结一下。

项目解决方法 — f_printf()四连


前言:刚开始尝试f_write()来写入,但总会出现各类问题,例如只写入一行数据、只有空文档、只有隐藏字符等问题。

解决

  1. 如果只需要写入一次数据,或者传感器采集所有数据后一次性写入,那么f_write()和f_printf()都可以,直接f_printf()+f_close()就可以;
  2. 多次写入就涉及指针偏移问题,需要使用f_lseek(),例如f_lseek(&fnew, f_size(&fnew));就是把指针移动到数据结尾,下一次写入就是从结尾后开始写入新数据,
    同理,f_lseek(&fnew, 0);是将指针指向文档开头位置。

我采用了最直接的方法,f_lseek()+f_printf()+f_close()+f_open()

        res_sd = f_lseek(&fnew, f_size(&fnew));
        f_printf(&fnew, "%s\r", WriteBuffer);
        f_close(&fnew); // 结束SD写入且保存 避免断电丢失数据
        f_open(&fnew, "0:下位机数据.txt", FA_WRITE);

分析四步

  • 先打开文件

    f_open(&fnew, "0:下位机数据.txt", FA_WRITE);

  • while(1)循环里面

    1 偏移地址,指向末尾

    f_lseek(&fnew, f_size(&fnew));

    2 写数据

    f_printf(&fnew, "%s\r", WriteBuffer); //或者f_write()

    3 关闭文件

    f_close(&fnew); // 结束SD写入且保存 避免断电丢失数据

    4 f_open(&fnew, "0:下位机数据.txt", FA_WRITE);

总结:避免掉电丢失数据,当然也有简单的方法,例如只需要开始打开一次文件,后续连续写入只需要同步f_sync()就可以了,不需要重复打开关闭。


如果SD里面文件没有数据,是空文档,下文也许是原因。

问题1 f_open() 参数设置错误


多次连续写入时,每次打开文件时f_open() 参数如果是FA_CREATE_ALWAYS,那么说明踩了一个坑了,例如:

f_open(&fnew, "0:下位机数据.txt", FA_CREATE_ALWAYS); // 初始化SD卡,删除数据

可以参考官方资料,FA_CREATE_ALWAYS每次会新建这个文件(不管这个文件是否存在),因此每次打开实际上都更新了文件,造成数据丢失。
PS:我在这卡了几个小时

解决:想要多次写入,填入FA_WRITE就可以解决问题了

f_open(&fnew, "0:下位机数据.txt", FA_WRITE);

注意,有这些参数:

在这里插入图片描述

第一次打开文件可以填入两个来避免新建文件导致数据丢失,保证后续能够从尾部写入。

res_sd = f_open(&fnew, "0:下位机数据.txt", FA_OPEN_EXISTING | FA_READ);

问题2 没有使用同步


我们在电脑上打开文档,都会ctrl+s保存,不然修改就会丢失。FatFs里有两个方法保存 / 同步。

  1. f_sync()

  2. 直接f_close()关闭

    f_close()这个操作相当于先执行f_sync()再关闭文件

问题3 没有使用偏移


如果你的数据一直只有一行数据,那可能是没有偏移指针,导致一直在同一个位置写入数据。

前文提及到,f_lseek(&fnew, f_size(&fnew));就是把指针移动到数据结尾,下一次写入就是从结尾后开始写入新数据。

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值