1. 程式人生 > >配置FatFs並批量寫入txt檔案

配置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函式。後來經幾天幾夜的測試,之前亂七八糟檔案出現的現象沒有了,檔案的寫入也很正常。下圖是我寫的檔案


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