原文:
我在stm32中移植了fatfs檔案系統,實現在sd卡對檔案的讀寫。在普通讀寫中都沒有問題,但是一旦我關閉檔案系統,再次開啟讀寫,之前寫的資料就被覆蓋。比如舉個例子:
u8 tx_buff="stm32f107學習!!!" //傳送緩衝1
u8 tx_buff1="檔案系統學習!!!!"//傳送緩衝2
fatfa fs;
fil fsrc;
fresult res;//讀寫狀態值
//初始化** 都正常 能讀到卡容量
下面開始讀寫:
f_mount(0,&fs);//註冊檔案系統
res=f_open(&fsrc,"123.txt",fa_open_always|fa_write);//如果存在則開啟,不存在則建立
if(res)
/現在寫入資料
res=f_write(&fsrc,tx_buff,buffersize,&br); //buffersize為傳送緩衝位元組數
if(res||br==0)
f_close(&fsrc);//關閉
//讀出資料
res=f_open(&fsrc,"123.txt",fa_open_always|fa_read);//以讀的方式開啟
res=f_read(&fsrc,fil_buffer,buffersize,&bw); //讀取資料
if(res||bw==0)
/到目前 讀出的資料 正常為
stm32f107學習!!!
f_close(&fsrc);//關閉
res=f_open(&fsrc,"123.txt",fa_open_always|fa_write|fa_read);// 現在以讀寫的方式開啟
res=f_write(&fsrc,tx_buff1,buffersize,&br); //寫入傳送緩衝1中的資料
res=f_read(&fsrc,fil_buffer,buffersize*2,&bw); //讀取資料
這個時候我以為讀出的資料應該是
stm32f107學習!!!檔案系統學習!!!!
但是讀出來的只有
檔案系統學習!!!!
也就是先前寫入的tx_buff中的資料被tx_buff1中的資料覆蓋了。
檢視f_open函式發現fp->fptr = 0;fp->dsect = 0;呼叫後每次開啟檔案會將指標清零,所以每次都從頭寫。
如果追加檔案則需要移動檔案指標,f_lseek函式則派上用處了。此函式用於檔案指標的移動,共有兩個引數,第乙個引數為檔案物件,第二個引數為移動的位元組數。在這裡則f_lseek(&fsrc,fsrc.fsize)指向檔案結尾,即可追加檔案。注意第二個引數是相對於檔案的開始,如f_lseek(&fsrc,3000),表示移動到檔案開頭3000個位元組處。靈活使用可以方便的操作檔案。
fatfs檔案系統f lseek追加檔案
這個時候我以為讀出的資料應該是 stm32f107學習!檔案系統學習!但是讀出來的只有 檔案系統學習!也就是先前寫入的tx buff中的資料被tx buff1中的資料覆蓋了。檢視f open函式發現fp fptr 0 fp dsect 0 呼叫後每次開啟檔案會將指標清零,所以每次都從頭寫。如果追加檔...
fatfs檔案系統
使用stm32cubemx新增fatfs下的user defined,開啟工程,檢視 可以發現 中先呼叫了mx fatfs init 函式,而此函式又呼叫了 fatfs linkdriver 函式,繼續查詢fatfs linkdriver 函式,發現此函式第乙個變數為diskio drvtypede...
FATFS檔案系統
二 修改fatfs 主要修改底層裝置驅動函式 diskio.c 目的 就是把 diskio.c 中的函式介面與spi flash 晶元驅動連線起來。總共有五個函式,分別為裝置狀態獲取 disk status 裝置初始化 disk initialize 扇區讀取 disk read 扇區寫入 disk...