STM32 SD-FatFS连续写入数据问题的解决方法及文档空白现象解决方案

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));就是把指针移动到数据结尾,下一次写入就是从结尾后开始写入新数据。

    物联沃分享整理
    物联沃-IOTWORD物联网 » STM32 SD-FatFS连续写入数据问题的解决方法及文档空白现象解决方案

    发表评论