用CH374枚舉U盤根目錄下文件以及打開文件遇到一些問題: 1.枚舉根目錄下的文件或者文件夾時,只能枚舉到排在前面的一個或者兩個文件/文件夾。 2.只能打開根目錄下的第一個文件,并且只能打開文件里面的前64個字符。 3.打開根目錄下其他文件時,會返回0x42。 4.打開子目錄下文件時,也會返回0x42。 程序調(diào)用的是CH374HF9.LIB庫,main函數(shù)里面主要都是從示例程序里面復制的程序,希望各位大蝦能夠幫忙看看,為什么會出現(xiàn)這些為題,下面是main函數(shù)里面和CH374相關的部分:
i = CH374LibInit( ); /* 初始化CH374程序庫和CH374芯片,操作成功返回0 */ mStopIfError( i ); while(1) { ak_printf("\r\nWaiting......\r\n"); while ( 1 ) { /* 支持USB-HUB */ ms_delay( 50 ); /* 沒必要頻繁查詢 */ if ( CH374DiskConnect( ) == ERR_SUCCESS ) { /* 查詢方式: 檢查磁盤是否連接并更新磁盤狀態(tài),返回成功說明連接 */ ms_delay( 100 ); /* 延時,可選操作,有的USB存儲器需要幾十毫秒的延時 */ ak_printf("Device_In\r\n"); /* 對于檢測到USB設備的,最多等待100*50mS,主要針對有些MP3太慢,對于檢測到USB設備并且連接DISK_MOUNTED的,最多等待5*50mS,主要針對DiskReady不過的 */ for ( i = 0; i < 100; i ++ ) { /* 最長等待時間,100*50mS */ ms_delay( 50 ); ak_printf( "Ready ?\r\n" ); if ( CH374DiskReady( ) == ERR_SUCCESS ) { ak_printf("Ready!\r\n"); break; /* 查詢磁盤是否準備好 */ } if ( CH374DiskStatus < DISK_CONNECT ) { /* 檢測到斷開,重新檢測并計時 */ ak_printf( "Device gone\n" ); break; /* 重新等待 */ } if ( CH374DiskStatus >= DISK_MOUNTED && i > 5 ) break; /* 有的U盤總是返回未準備好,不過可以忽略,只要其建立連接MOUNTED且嘗試5*50mS */ if ( CH374DiskStatus == DISK_CONNECT ) { /* 有設備連接 */ if ( CH374vHubPortCount ) { /* 連接了一個USB-HUB,但可能沒有U盤 */ ak_printf( "No Udisk in USB_HUB\n" ); break; } else { /* 未知USB設備,有可能是U盤反應太慢,所以要再試試 */ } } } if ( CH374DiskStatus >= DISK_MOUNTED ) { /* 是U盤 */ break; /* 開始操作U盤 */ } if ( CH374DiskStatus == DISK_CONNECT ) { /* 多次嘗試還是不行,估計不是U盤 */ if ( CH374vHubPortCount ) { /* 連接了一個USB-HUB,但可能沒有U盤 */ /* 在while中等待HUB端口有U盤 */ } else { /* 未知USB設備,例如USB鍵盤、打印機等,而且已經(jīng)試了很多次還不行 */ ak_printf( "Unknown device\n" ); } } } } ms_delay(200); #if DISK_BASE_BUF_LEN if ( DISK_BASE_BUF_LEN < CH374vSectorSize ) { // 檢查磁盤數(shù)據(jù)緩沖區(qū)是否足夠大,CH374vSectorSize是U盤的實際扇區(qū)大小 ak_printf( "Too large sector size\r\n" ); continue; } #endif
ak_printf("Enumer begin:\r\n"); for ( c=0; c<254; c++ ) { // 最多搜索前 254 個文件 strcpy( mCmdParam.Enumer.mPathName, "\\*" ); i = strlen( mCmdParam.Enumer.mPathName ); // 計算文件名長度,指向結束符 mCmdParam.Enumer.mPathName[i] = c; // 將結束符替換為搜索的序號,從 0 到 254 i=CH374FileEnumer( ); // 文件名中含有通配符*,枚舉/搜索文件而不打開 if ( i==ERR_MISS_FILE ){ ak_printf("再也搜索不到匹配文件,已經(jīng)沒有匹配的文件名\r\n"); break; // 再也搜索不到匹配文件,已經(jīng)沒有匹配的文件名 } if ( i!=ERR_SUCCESS ){ ak_printf("出錯\r\n"); break; // 出錯 } ak_printf( "found name %d#: %s\r\n", (unsigned int)c, mCmdParam.Enumer.mPathName ); // 搜索到相匹配的文件名,顯示序號和搜索到的匹配文件名或者子目錄名 } ak_printf("Enumer end!\r\n"); ak_printf( "Open file \r\n" ); strcpy( (char *)mCmdParam.Open.mPathName, "/ABCD.C" ); //* 文件名,該文件在C51子目錄下 i = CH374FileOpen( ); // ak_printf("%s \r\n",mCmdParam.Open.mPathName); mStopIfError( i ); if ( i == ERR_MISS_DIR || i == ERR_MISS_FILE ) { // 沒有找到文件 // 列出文件 if ( i == ERR_MISS_DIR ) pCodeStr = (PUINT8)"/*"; // C51子目錄不存在則列出根目錄下的文件 else pCodeStr = (PUINT8)"/CH374*"; // CH374HFT.C文件不存在則列出\C51子目錄下的以CH374開頭的文件 ak_printf( "List file %s \r\n", pCodeStr ); for ( c = 0; c < 254; c ++ ) { // 最多搜索前254個文件,如果要搜索大255個文件請參考EXAM1和EXAM0 strcpy( (char *)mCmdParam.Open.mPathName, (char *)pCodeStr ); // 搜索文件名,*為通配符,適用于所有文件或者子目錄 i = strlen( (char *)mCmdParam.Open.mPathName ); mCmdParam.Open.mPathName[ i ] = c; // 根據(jù)字符串長度將結束符替換為搜索的序號,從0到254 i = CH374FileOpen( ); // 打開文件,如果文件名中含有通配符*,則為搜索文件而不打開 if ( i == ERR_MISS_FILE ) break; // 再也搜索不到匹配的文件,已經(jīng)沒有匹配的文件名 if ( i == ERR_FOUND_NAME ) { // 搜索到與通配符相匹配的文件名,文件名及其完整路徑在命令緩沖區(qū)中 ak_printf( " match file %03d#: %s\n", (unsigned int)c, mCmdParam.Open.mPathName ); // 顯示序號和搜索到的匹配文件名或者子目錄名 continue; // 繼續(xù)搜索下一個匹配的文件名,下次搜索時序號會加1 } else { // 出錯 mStopIfError( i ); break; } } } else { // 找到文件或者出錯 mStopIfError( i ); gpio_set_pin_level(GPIO_LED_3,0); TotalCount=100; ak_printf( "文件路徑:%s,從文件中讀出的前%d個字符是:\r\n\r\n",mCmdParam.Open.mPathName,TotalCount ); ak_printf("\r\n"); while ( TotalCount ) { // 如果文件比較大,一次讀不完,可以再調(diào)用CH374ByteRead繼續(xù)讀取,文件指針自動向后移動 if ( TotalCount > MAX_BYTE_IO ) c = MAX_BYTE_IO; // 剩余數(shù)據(jù)較多,限制單次讀寫的長度不能超過 sizeof( mCmdParam.ByteRead.mByteBuffer ) else c = TotalCount; // 最后剩余的字節(jié)數(shù) mCmdParam.ByteRead.mByteCount = c; // 請求讀出幾十字節(jié)數(shù)據(jù) i = CH374ByteRead( ); // 以字節(jié)為單位讀取數(shù)據(jù)塊,單次讀寫的長度不能超過MAX_BYTE_IO,第二次調(diào)用時接著剛才的向后讀 mStopIfError( i ); TotalCount -= mCmdParam.ByteRead.mByteCount; // 計數(shù),減去當前實際已經(jīng)讀出的字符數(shù) for ( i=0; i!=mCmdParam.ByteRead.mByteCount; i++ ) ak_printf( "%c", mCmdParam.ByteRead.mByteBuffer[i] ); // 顯示讀出的字符 ak_printf("\r\n"); if ( mCmdParam.ByteRead.mByteCount < c ) { // 實際讀出的字符數(shù)少于要求讀出的字符數(shù),說明已經(jīng)到文件的結尾 ak_printf( "\r\n" ); ak_printf( "文件已經(jīng)結束\n" ); break; } } ak_printf( "\r\nClose\r\n" ); i = CH374FileClose( ); //關閉文件 mStopIfError( i ); ak_printf( "\r\n" ); } ak_printf("\r\n");
}