STM32 SD-FatFS连续写入数据无效与解决方法 文档空白解决方法
引言:STM32下位机做毕设遇到这个问题,用FatFS对SD卡多次连续写入的时候,SD卡中内容是空的,或者是看不见的字符。我将遇到的问题和解决方法总结一下。
项目解决方法 — f_printf()四连
前言:刚开始尝试f_write()来写入,但总会出现各类问题,例如只写入一行数据、只有空文档、只有隐藏字符等问题。
解决:
- 如果只需要写入一次数据,或者传感器采集所有数据后一次性写入,那么f_write()和f_printf()都可以,直接
f_printf()+f_close()
就可以; - 多次写入就涉及指针偏移问题,需要使用
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写入且保存 避免断电丢失数据
4f_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里有两个方法保存 / 同步。
- f_sync()
- 直接f_close()关闭
f_close()这个操作相当于先执行f_sync()再关闭文件
问题3 没有使用偏移
如果你的数据一直只有一行数据,那可能是没有偏移指针,导致一直在同一个位置写入数据。
前文提及到,f_lseek(&fnew, f_size(&fnew));
就是把指针移动到数据结尾,下一次写入就是从结尾后开始写入新数据。