是這樣的,我用單片機(jī)通過CH376來對U盤進(jìn)行操作,現(xiàn)在遇到2個(gè)問題: 第一個(gè):如何刪除TXT文檔中的一段數(shù)據(jù)。好比,我的TXT現(xiàn)在有10K的數(shù)據(jù),我想刪除掉最后的400字節(jié)的數(shù)據(jù),這該怎么做?我看了CH376的示范代碼以及文檔,都只有刪除整個(gè)文件,而沒有刪除其中個(gè)別數(shù)據(jù)的例子。 第二個(gè)問題:如果是在任意位置刪除400字節(jié)的話,應(yīng)該怎么做呢?項(xiàng)目進(jìn)行到現(xiàn)在,就差這個(gè)刪除操作了。希望能得到解答,謝謝
一、您可以強(qiáng)制修改文件長度,比如10K,你可以把文件長度強(qiáng)制改為9K624B,可以參考例程EXAM8 二、沒有什么好的辦法,只有你把文件指針定位到你想刪除的地方,然后把文件后面的除了要?jiǎng)h除的400字節(jié)數(shù)據(jù)讀出來,然后再把文件把文件指針定位到你想刪除的地方,把讀出來的數(shù)據(jù)寫入文件
最后400個(gè)字節(jié)數(shù)據(jù)很好操作,你只需要將文件長度更新燒400字節(jié)即可。 中間400字節(jié)那就比較麻煩。需要跳至你需要?jiǎng)h除開始的位置,然后將后續(xù)數(shù)據(jù)讀取出來,將要?jiǎng)h除的數(shù)據(jù)剔除,將后續(xù)數(shù)據(jù)寫入至此文件刪除開始位置。
好的,明白了,謝謝二位
這個(gè)程序是運(yùn)行到”檢測U盤是否插入“的地方,就一直重啟單片機(jī),不知道為什么,新手求解。 #include #include #include
#define EN_DISK_QUERY 1 /* 啟用磁盤查詢 */
#include "HAL.H" #include "DEBUG.H" #include "FILE_SYS.H" #include "CH376INC.H"
UINT8 xdata buf[64];
void main(void) { UINT8 i, s; UINT16 len; P_FAT_DIR_INFO pDir; UINT8 xdata SrcName[64]; UINT8 xdata TarName[64]; mDelaymS( 100 ); /* 延時(shí)100毫秒 */ mInitSTDIO( ); /* 為了讓計(jì)算機(jī)通過串口監(jiān)控演示過程 */ printf( "系統(tǒng)啟動---Start\n" );
s = mInitCH376Host( ); /* 初始化CH376 */ mStopIfError( s ); /* 其它電路初始化 */
while ( 1 ) { printf( "等待U盤或者SD卡插入---Wait Udisk/SD\n" );
while ( CH376DiskConnect( ) != USB_INT_SUCCESS ) { /* 檢查U盤是否連接,等待U盤插入,對于SD卡,可以由單片機(jī)直接查詢SD卡座的插拔狀態(tài)引腳 */ mDelaymS( 100 ); }
mDelaymS( 200 ); /* 延時(shí),可選操作,有的USB存儲器需要幾十毫秒的延時(shí) */
/* 對于檢測到USB設(shè)備的,最多等待100*50mS,主要針對有些MP3太慢,對于檢測到USB設(shè)備并且連接DISK_MOUNTED的,最多等待5*50mS,主要針對DiskReady不過的 */ for ( i = 0; i < 100; i ++ ) { /* 最長等待時(shí)間,100*50mS */ mDelaymS( 50 ); printf( "準(zhǔn)備好了? ---- Ready ?\n" ); s = CH376DiskMount( ); /* 初始化磁盤并測試磁盤是否就緒 */ if ( s == USB_INT_SUCCESS ) break; /* 準(zhǔn)備好 */ else if ( s == ERR_DISK_DISCON ) break; /* 檢測到斷開,重新檢測并計(jì)時(shí) */ if ( CH376GetDiskStatus( ) >= DEF_DISK_MOUNTED && i >= 5 ) break; /* 有的U盤總是返回未準(zhǔn)備好,不過可以忽略,只要其建立連接MOUNTED且嘗試5*50mS */ }
if ( s == ERR_DISK_DISCON ) { /* 檢測到斷開,重新檢測并計(jì)時(shí) */ printf( "設(shè)備已斷開---Device gone\n" ); continue; }
if ( CH376GetDiskStatus( ) < DEF_DISK_MOUNTED ) { /* 未知USB設(shè)備,例如USB鍵盤、打印機(jī)等 */ printf( "Unknown device\n" ); goto UnknownUsbDevice; } i = CH376ReadBlock( buf ); /* 如果需要,可以讀取數(shù)據(jù)塊CH376_CMD_DATA.DiskMountInq,返回長度 */ if ( i == sizeof( INQUIRY_DATA ) ) { /* U盤的廠商和產(chǎn)品信息 */ buf[ i ] = 0; printf( "U盤廠商---UdiskInfo: %s\n", ((P_INQUIRY_DATA)buf) -> VendorIdStr ); }
/* 讀取文件 */ strcpy( SrcName, "\\C51\\CH376HFT.C" ); /* 源文件名,多級目錄下的文件名和路徑名必須復(fù)制到RAM中再處理,而根目錄或者當(dāng)前目錄下的文件名可以在RAM或者ROM中 */ strcpy( TarName, "\\NEWFILE.TXT" ); /* 目標(biāo)文件名 */ printf( "打開文件 --- Open\n" ); s = CH376FileOpenPath( SrcName ); /* 打開文件,該文件在C51子目錄下 */ if ( s == ERR_MISS_DIR || s == ERR_MISS_FILE ) { /* 沒有找到目錄或者沒有找到文件 */ /* 列出文件,完整枚舉可以參考EXAM13全盤枚舉 */ if ( s == ERR_MISS_DIR ) strcpy( buf, "\\*" ); /* C51子目錄不存在則列出根目錄下的文件 */ else strcpy( buf, "\\C51\\CH376*" ); /* CH376HFT.C文件不存在則列出\C51子目錄下的以CH376開頭的文件 */ printf( "列舉所有文件---List file %s\n", buf ); s = CH376FileOpenPath( buf ); /* 枚舉多級目錄下的文件或者目錄,輸入緩沖區(qū)必須在RAM中 */ while ( s == USB_INT_DISK_READ ) { /* 枚舉到匹配的文件 */ CH376ReadBlock( buf ); /* 讀取枚舉到的文件的FAT_DIR_INFO結(jié)構(gòu),返回長度總是sizeof( FAT_DIR_INFO ) */ pDir = (P_FAT_DIR_INFO)buf; /* 當(dāng)前文件目錄信息 */ if ( pDir -> DIR_Name[0] != '.' ) { /* 不是本級或者上級目錄名則繼續(xù),否則必須丟棄不處理 */ if ( pDir -> DIR_Name[0] == 0x05 ) pDir -> DIR_Name[0] = 0xE5; /* 特殊字符替換 */ pDir -> DIR_Attr = 0; /* 強(qiáng)制文件名字符串結(jié)束以便打印輸出 */
/* 打印名稱,原始8+3格式,未整理成含小數(shù)點(diǎn)分隔符 */ printf( "*** EnumName: %s\n", pDir -> DIR_Name ); } xWriteCH376Cmd( CMD0H_FILE_ENUM_GO ); /* 繼續(xù)枚舉文件和目錄 */ xEndCH376Cmd( ); s = Wait376Interrupt( ); } if ( s != ERR_MISS_FILE ) mStopIfError( s ); /* 操作出錯(cuò) */
/*--- 新建一個(gè)文件 ---*/ printf( "新文件被創(chuàng)建---Create\n" ); s = CH376FileCreatePath( TarName ); /* 新建多級目錄下的文件,支持多級目錄路徑,輸入緩沖區(qū)必須在RAM中 */ mStopIfError( s ); printf( "新文件被寫入---Write\n" ); strcpy( buf, "找不到/C51/CH376HFT.C文件,歡迎使用一鳴電子模塊!\xd\n" ); s = CH376ByteWrite( buf, strlen(buf), NULL ); /* 以字節(jié)為單位向當(dāng)前位置寫入數(shù)據(jù)塊 */ mStopIfError( s ); printf( "新文件被關(guān)閉---Close\n" ); s = CH376FileClose( TRUE ); /* 關(guān)閉文件,對于字節(jié)讀寫建議自動更新文件長度 */ mStopIfError( s );
printf("\n"); strcpy( TarName, "\\YI.TXT" ); /* 目標(biāo)文件名 */ /*--- 新建另外一個(gè)文件;文件名:yimingtest.txt ---*/ printf( "創(chuàng)建另外一個(gè)文件---Create\n" ); s = CH376FileCreatePath( TarName ); mStopIfError( s ); printf( "新文件被寫入----Write\n" ); strcpy( buf, "恭喜發(fā)財(cái)了!\xd\n" ); s = CH376ByteWrite( buf, strlen(buf) , NULL); mStopIfError ( s ); printf( "文件被關(guān)閉 --- Close\n" ); s = CH376FileClose(TRUE); mStopIfError( s );
/*--- 追加文件數(shù)據(jù)的例子 ---*/ printf( "\n" ); strcpy( SrcName, "\\YI.TXT" ); s = CH376FileOpenPath( SrcName ); printf( "Error: %02X\n", (UINT16)s ); if( s == USB_INT_SUCCESS ) { //成功打開文件 strcpy( buf, "是不是要請哥們吃飯了呢?\xd\n" ); CH376ByteLocate(0xFFFFFFFF); s = CH376ByteWrite( buf, strlen(buf) , NULL); mStopIfError ( s ); printf( "文件被關(guān)閉 --- Close\n" ); s = CH376FileClose(TRUE); mStopIfError( s ); } else mStopIfError( s ); /*--- 讀取文件數(shù)據(jù)的例子 ---*/ printf( "\n" ); printf( "讀取文件數(shù)據(jù)的例子:\n" ); strcpy( SrcName, "\\YI.TXT" ); s = CH376FileOpenPath( SrcName ); printf( "Error: %02X\n", (UINT16)s ); if( s == USB_INT_SUCCESS ) { len = CH376GetFileSize(); CH376ByteLocate( 0 ); CH376ByteRead(buf,len,NULL); printf( "%s \n", buf);
mStopIfError ( s ); printf( "文件被關(guān)閉 --- Close\n" ); s = CH376FileClose(TRUE); mStopIfError( s ); } else mStopIfError( s ); } else { /* 找到文件或者出錯(cuò) */ mStopIfError( s ); }
UnknownUsbDevice: printf( "設(shè)備拔出 --- Take out\n" ); while ( CH376DiskConnect( ) == USB_INT_SUCCESS ) { /* 檢查U盤是否連接,等待U盤拔出 */ mDelaymS( 100 ); } mDelaymS( 200 ); }
你把原理圖發(fā)到我郵箱。正常連接的情況下,我們芯片不對導(dǎo)致你單片機(jī)復(fù)位的,單片機(jī)復(fù)位因素主要有電源不穩(wěn)定,復(fù)位引腳有復(fù)位信號,看門狗復(fù)位,你檢測下是什么情況導(dǎo)致你單片機(jī)復(fù)位的