各位大蝦:
??? 如題。
短文件名讀寫操作都沒問題,最近想要對長文件名進行操作,可是按照例程11,創(chuàng)建都不成功。無法得到長文件名,只能得到短文件名。請大蝦們指導指導,謝謝!?。?/p>
各位大蝦:
??? 如題。
短文件名讀寫操作都沒問題,最近想要對長文件名進行操作,可是按照例程11,創(chuàng)建都不成功。無法得到長文件名,只能得到短文件名。請大蝦們指導指導,謝謝!?。?/p>
?
定義的長文件名:UINT8?code?LongName2[] =
{
?"This is Long Name File !!!.H"
};
??主程序參照例程11,
? for ( j = 0; LongName2[j] != 0; j++ ) {? /* 復制并轉(zhuǎn)換長文件名到LongNameBuf長文件名緩沖區(qū) */
???LongNameBuf[j*2] = LongName2[j];? /* 將英文字符轉(zhuǎn)換為兩字節(jié)的小端UNICODE編碼 */
???LongNameBuf[j*2+1] = 0x00;
??}
??LongNameBuf[j*2] = 0x00;? // 末尾用兩個0表示結(jié)束
??LongNameBuf[j*2+1] = 0x00;
//??strcpy( PathNameBuf, "/LONGNAME.H" );? // 復制該長文件名的ANSI編碼的全路徑的短文件名(8+3格式),短文件名由長文件名生成(只要不沖突,其實隨便定)
??s = CH376CreateLongName( "/LONGNAME.H", LongNameBuf );? /* 新建具有長文件名的文件 */
單步發(fā)現(xiàn)我的程序在這個函數(shù)while里出不去
UINT8?CH376LocateInUpDir( PUINT8 PathName )? /* 在上級目錄(文件夾)中移動文件指針到當前文件目錄信息所在的扇區(qū) */
/* 另外,順便將當前文件目錄信息所在的扇區(qū)的前一個扇區(qū)的LBA地址寫入CH376內(nèi)部VAR_FAT_DIR_LBA變量(為了方便收集長文件名時向前搜索,否則要多移動一次) */
/* 使用了全局緩沖區(qū)GlobalBuf的前12個字節(jié) */
{
?UINT8?s;
?xWriteCH376Cmd( CMD14_READ_VAR32 );
?xWriteCH376Data( VAR_FAT_DIR_LBA );? /* 當前文件目錄信息所在的扇區(qū)LBA地址 */
?for ( s = 4; s != 8; s ++ ) GlobalBuf[ s ] = xReadCH376Data( );? /* 臨時保存于全局緩沖區(qū)中,節(jié)約RAM */
?//xEndCH376Cmd( );
?s = CH376SeparatePath( PathName );? /* 從路徑中分離出最后一級文件名或者目錄名,返回最后一級文件名或者目錄名的偏移 */
?if ( s ) s = CH376FileOpenDir( PathName, s );? /* 是多級目錄,打開多級目錄下的最后一級目錄,即打開文件的上級目錄 */
?else s = CH376FileOpen( "/" );? /* 根目錄下的文件,則打開根目錄 */
?if ( s != ERR_OPEN_DIR ) return( s );
?*(PUINT32)(&GlobalBuf[0]) = 0;? /* 目錄扇區(qū)偏移扇區(qū)數(shù),保存在全局緩沖區(qū)中,節(jié)約RAM */
?while ( 1 ) {? /* 不斷移動文件指針,直到與當前文件目錄信息所在的扇區(qū)LBA地址匹配 */
??s = CH376SecLocate( *(PUINT32)(&GlobalBuf[0]) );? /* 以扇區(qū)為單位在上級目錄中移動文件指針 */
??if ( s != USB_INT_SUCCESS ) return( s );
??CH376ReadBlock( &GlobalBuf[8] );? /* 從內(nèi)存緩沖區(qū)讀取CH376_CMD_DATA.SectorLocate.mSectorLba數(shù)據(jù)塊,返回長度總是sizeof(CH376_CMD_DATA.SectorLocate) */
??if ( *(PUINT32)(&GlobalBuf[8]) == *(PUINT32)(&GlobalBuf[4]) ) return( USB_INT_SUCCESS );? /* 已到當前文件目錄信息扇區(qū) */
??xWriteCH376Cmd( CMD50_WRITE_VAR32 );
??xWriteCH376Data( VAR_FAT_DIR_LBA );? /* 得到前一個扇區(qū),設(shè)置為新的文件目錄信息扇區(qū)LBA地址 */
??for ( s = 8; s != 12; s ++ ) xWriteCH376Data( GlobalBuf[ s ] );
??//xEndCH376Cmd( );
??++ *(PUINT32)(&GlobalBuf[0]);
?}
}
讀到的GlobalBuf[4]--[ 7 ] 數(shù)值很大 為:0x28 0x5A 0x80 0x80?? 怎么回事?
這個函數(shù)里面CH376SecLocate這個值返回是多少?這個函數(shù)實際上就是找空閑的目錄項在填長文件名。
返回值是0x14
也抓到過為0的時候?
蒙圈了
有沒有哪位遇見過呢?求賜教。折騰了一個星期了。
0X14怎么會退出不來函數(shù)呢?單片機和CH376之間的接口是哪個接口?串口?SPI?并口?
已經(jīng)得到解答了,我的單片機和CH376是串口通信,按照例程是不能實現(xiàn)長文件名的,必須修改串口發(fā)送命令函數(shù),就是要在發(fā)送完兩個同步碼后清空接收緩存區(qū)及FIFO。
但是目前我還沒有時間測試,因為剛好有預留的SPI方式通信,所以直接改成SPI方式了,已經(jīng)可以實現(xiàn)對長文件名的操作了。? 等項目結(jié)束,有空的時候,再測測串口方式。十分感謝大家對我的幫助,尤其是貴公司蔡工。