1、定義一些變數在我們代碼開始的部分,先定義一些變數供我們使用。這裡選擇幾個來解析一下。第一個FIL file;這個變數是文件的結構體變數,記錄了我們打開的文件的信息。使用f_open等函數的時候都要用到。第二個Words變數是一個字元串指針,我用這個指針來存儲讀取的字元信息。這裡我們就使用了mal ...
1、定義一些變數
在我們代碼開始的部分,先定義一些變數供我們使用。這裡選擇幾個來解析一下。
第一個FIL file;這個變數是文件的結構體變數,記錄了我們打開的文件的信息。使用f_open等函數的時候都要用到。
第二個Words變數是一個字元串指針,我用這個指針來存儲讀取的字元信息。這裡我們就使用了malloc函數來分配記憶體,我們通過修改啟動代碼提供了更多的堆記憶體所以這裡就可以分配一些給我們使用。
第三個是Path這個字元串,這裡保存的是文件所在的路徑。關於文件路徑的寫法,請參考FatFs的官方文檔 網站。
FIL file; uint8_t Status = 0; char* Words = malloc(256); char* String = "\nWrite some words to this file by STM32F407 MCU.\n"; UINT Number = 0; char Path[16] = "/File/test.txt";
2、使用f_open
關於f_open函數的具體用法和詳細說明,參見FatFs官方文檔 網站。這裡可以看看我在下方貼出的代碼作為參考來使用。
3、使用f_read
關於f_read沒有特別的說明,詳細的用法去看看FatFs官方文檔 網站。這裡只想說一下第三個和第四個參數。這裡的第三個參數是給定的要讀取的位元組數,而第四個參數是最後讀取了的位元組數的存儲指針。這裡要說明的是,不一定你要讀取128個位元組就一定會讀取這麼多,如果遇到了文件尾符號就會停止讀取。停止讀取的時候就會把讀取的位元組數寫入到第四個參數指定的存儲空間里。所以我們可以通過返回的讀取位元組數來發送到串口,不需要自己數讀取了多少個位元組。
if(!f_open(&file, Path, FA_READ | FA_OPEN_EXISTING | FA_WRITE)) { f_read(&file, Words, 256, &Number); HAL_UART_Transmit(&huart1, (uint8_t *)Words, Number, 500); }
4、使用f_lseek
我在調用f_write函數之前,調用了一下f_lseek函數來移動文件指針。不過在這裡並不需要,你們參考我的完整工程文件就知道。在這之前我已經進行了文件讀取的操作,文件指針已經定位在了文件的最後一個位元組這裡。不過我還是調用了一下,因為有時候需要用到這個函數。這個函數的詳細用法請參考FatFs的官方文檔 網站。
5、使用f_write
f_write的用法和f_read非常相似,這裡就不在贅述。第三個參數和第四個參數的含義也是大同小異。想瞭解這個函數的詳細說明,請參考FatFs的官方文檔 網站。
f_lseek(&file, Number); Status = f_write(&file, String, 49, &Number);
6、使用f_close
f_close這個函數的用法就非常的簡單了,這裡在寫入操作之後要調用一次這個函數。調用了這個函數之後,寫入的信息才可以保存在SD卡的上面,下一次才可以讀取出來。如果沒有使用這個函數的話,文件就會存儲在緩衝區中,只有這一次讀取可以成功。到了下一次複位的時候,讀取的還是原先的文件內容。
f_close(&file);
7、再次讀取文件內容
現在我們有寫入了一些信息到了我們的文件裡面,再次讀取一下看看寫入成功了嗎。下麵的代碼實現了這一功能,大家參考一下。
f_open(&file, Path, FA_READ | FA_OPEN_EXISTING); if(!Status) { f_read(&file, Words, 256, &Number); HAL_UART_Transmit(&huart1, (uint8_t *)Words, Number, 500); } f_close(&file);
五、上電測試
代碼我們都準備好了,只要編譯通過下載到我們的開發板上就行了。如果你的硬體連接都非常的正確,而且按照前面的步驟來的話就可以開始測試讀取SD卡了。
我在SD卡的根目錄下建立了/File/test.txt
初始的文件內容如下:
This is a test file to confirm the library of FatFs.
Don't support Chinese in this file.
Wish you a good luck!
測試結果
觀察兩次的輸出結果可以看得出來,第二次複位的時候文件的末尾又多了一行文字。這一現象符合我們的程式邏輯。大家可以對比一下這裡的結果,自己做一個參考。