配置FatFs並批量寫入txt檔案
繼上一篇文章連線好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函式。後來經幾天幾夜的測試,之前亂七八糟檔案出現的現象沒有了,檔案的寫入也很正常。下圖是我寫的檔案
至此,我的批量儲存功能已經完成,文中如有不合理的地方,也請大家指正。