fatfs檔案系統f lseek追加檔案

2021-08-15 14:10:17 字數 1392 閱讀 8020

原文:

我在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...