printf( "Open\n" ); mCopyCodeStringToIRAM( mCmdParam.Open.mPathName, "/LCSOFT.TXT" ); /* 文件名,該文件在C51子目錄下 */ i = CH375FileOpen( ); /* 打開文件 */ if ( i == ERR_MISS_DIR || i == ERR_MISS_FILE ) { /* 沒有找到C51子目錄,沒有找到CH375HFT.C文件 */ /* 列出文件 */ if ( i == ERR_MISS_DIR ) pCodeStr = "/*"; /* C51子目錄不存在則列出根目錄下的所有文件 */ else pCodeStr = "/LC*"; /* CH375HFT.C文件不存在則列出\C51子目錄下的以CH375開頭的文件 */ printf( "List file %s\n", pCodeStr ); for ( EnumCount = 0; EnumCount < 10000; EnumCount ++ ) { /* 最多搜索前10000個(gè)文件,實(shí)際上沒有限制 */ i = mCopyCodeStringToIRAM( mCmdParam.Open.mPathName, pCodeStr ); /* 搜索文件名,*為通配符,適用于所有文件或者子目錄 */ mCmdParam.Open.mPathName[ i ] = 0xFF; /* 根據(jù)字符串長(zhǎng)度將結(jié)束符替換為搜索的序號(hào),從0到254,如果是0xFF即255則說明搜索序號(hào)在CH375vFileSize變量中 */ CH375vFileSize = EnumCount; /* 指定搜索/枚舉的序號(hào) */ i = CH375FileOpen( ); if ( i == ERR_MISS_FILE ) break; /* 再也搜索不到匹配的文件,已經(jīng)沒有匹配的文件名 */ if ( i == ERR_FOUND_NAME ) { /* 搜索到與通配符相匹配的文件名,文件名及其完整路徑在命令緩沖區(qū)中 */ printf( " match file %04d#: %s\n", (unsigned int)EnumCount, mCmdParam.Open.mPathName ); /* 顯示序號(hào)和搜索到的匹配文件名或者子目錄名 */ continue; /* 繼續(xù)搜索下一個(gè)匹配的文件名,下次搜索時(shí)序號(hào)會(huì)加1 */ } else { /* 出錯(cuò) */ mStopIfError( i ); break; } } } else { /* 找到文件或者出錯(cuò) */ mStopIfError( i ); TotalCount = CH375vFileSize; /* 準(zhǔn)備讀取總長(zhǎng)度 */ printf( "從文件中讀出的前%d個(gè)字符是:\n",(UINT16)TotalCount ); while ( TotalCount ) { /* 如果文件比較大,一次讀不完,可以再調(diào)用CH375ByteRead繼續(xù)讀取,文件指針自動(dòng)向后移動(dòng) */ if ( TotalCount > MAX_BYTE_IO ) c = MAX_BYTE_IO; /* 剩余數(shù)據(jù)較多,限制單次讀寫的長(zhǎng)度不能超過 sizeof( mCmdParam.ByteRead.mByteBuffer ) */ else c = TotalCount; /* 最后剩余的字節(jié)數(shù) */ mCmdParam.ByteRead.mByteCount = c; /* 請(qǐng)求讀出幾十字節(jié)數(shù)據(jù) */ i = CH375ByteRead( ); /* 以字節(jié)為單位讀取數(shù)據(jù)塊,單次讀寫的長(zhǎng)度不能超過MAX_BYTE_IO,第二次調(diào)用時(shí)接著剛才的向后讀 */ mStopIfError( i ); TotalCount -= mCmdParam.ByteRead.mByteCount; /* 計(jì)數(shù),減去當(dāng)前實(shí)際已經(jīng)讀出的字符數(shù) */ for ( i=0; i!=mCmdParam.ByteRead.mByteCount; i++ ) printf( "%C", mCmdParam.ByteRead.mByteBuffer[i] ); /* 顯示讀出的字符 */ if ( mCmdParam.ByteRead.mByteCount < c ) { /* 實(shí)際讀出的字符數(shù)少于要求讀出的字符數(shù),說明已經(jīng)到文件的結(jié)尾 */ printf( "\n" ); printf( "文件已經(jīng)結(jié)束\n" ); break; } } printf( "Close\n" ); i = CH375FileClose( ); /* 關(guān)閉文件 */ mStopIfError( i ); }
我的結(jié)果是顯示了open,然后有時(shí)有Error:14,有時(shí)沒有,就停住了,不知道有沒有技術(shù)或者前輩幫我看下,還有,中秋節(jié)快樂!
我把U盤文件全刪了,空了,又返回Error:92了
我看了下說error:92是說U盤磁盤分區(qū)類型不支持,為什么呢,我的文件系統(tǒng)是FAT32,謝謝了
你用的是什么單片機(jī)?需要看下你編譯之后的單片機(jī)使用的資源,還有就是需要看下你的CH375DISKREADY()這個(gè)函數(shù)返回的數(shù)據(jù)是多少?
P89V51,64K flash,1024B RAM。 Program Size: data=91.5 xdata=588 const=0 code=11098。返回00
我試了兩個(gè)程序,都是在這句話上有問題了 mCopyCodeStringToXRAM( mCmdParam.Open.mPathName, "/XP.TXT" ); i = CH375FileOpen(); 返回的i貌似不對(duì)了,不是ERR_MISS_FILE不是ERR_SUCCESS,應(yīng)該也不是ERR_MISS_DIR
請(qǐng)問大家,可能是什么情況?謝謝
這種情況需要仔細(xì)檢查下CH375_INT引腳。因?yàn)樵谥袛嗪瘮?shù)里面使用了中斷引腳。
檢查了,INT引腳復(fù)位時(shí)低電平,其他時(shí)間高電平,我的第二個(gè)程序是這樣的 while ( 1 ) {
//------------------------------------------------------------------------------------------- // 查詢CH375中斷并更新中斷狀態(tài),等待U盤插入 printf("請(qǐng)插入U(xiǎn)盤后復(fù)位單片機(jī).."); while ( CH375DiskStatus != DISK_CONNECT ) { DelayCS(20); i = CH375LibInit(); DelayCS(5); xQueryInterrupt(); } printf("\nok\n");
mDelaymS( 200 ); //延時(shí),可選操作,有的USB存儲(chǔ)器需要幾十毫秒的延時(shí) //------------------------------------------------------------------------------------------- // 檢查U盤是否準(zhǔn)備好,有些U盤不需要這一步,但是某些U盤必須要執(zhí)行這一步才能工作 // 有的U盤總是返回未準(zhǔn)備好,不過可以被忽略 for ( i = 0; i < 5; i ++ ) { mDelaymS( 100 ); printf("檢查U盤是否準(zhǔn)備好.. "); if ( CH375DiskReady() == ERR_SUCCESS ) break; //查詢磁盤是否準(zhǔn)備好.
} printf("ok\n"); //---------------------------------------------------------------------------------------- // 查詢磁盤物理容量 i = CH375DiskSize(); mStopIfError( i ); //顯示為以MB為單位的容量 printf("\nU盤容量為:%ld MB\n\n",mCmdParam.DiskSize.mDiskSizeSec/2048); //-------------------------------------------------------------------------------- //如果XP.TXT文件已經(jīng)存在則添加數(shù)據(jù)到尾部,如果不存在則新建文件 //文件名,該文件在根目錄下 mCopyCodeStringToXRAM( mCmdParam.Open.mPathName, "/XP.TXT" ); i = CH375FileOpen(); // 打開文件 mStopIfError( i ); //文件存在并且已經(jīng)被打開 if ( i == ERR_SUCCESS ) {
printf("打開文件 XP.TXT\n"); mCmdParam.ByteLocate.mByteOffset = 0; /* 移到文件的首部 */ i = CH375ByteLocate(); mStopIfError( i );
} // 沒有找到文件,必須新建文件 else if ( i == ERR_MISS_FILE ) { printf("創(chuàng)建文件 XP.TXT\n"); //文件名,該文件在根目錄下,剛才已經(jīng)提供給CH375FileOpen mCopyCodeStringToXRAM( mCmdParam.Create.mPathName, "/XP.TXT" ); i = CH375FileCreate(); // 新建文件并打開,如果文件已經(jīng)存在則先刪除后再新建 mStopIfError( i ); } // 打開文件時(shí)出錯(cuò) else { mStopIfError( i ); }
//------------------------------- //寫操作. printf("正在將數(shù)據(jù)寫入文件.. "); mCmdParam.ByteLocate.mByteOffset = 0xffffffff; /* 移到文件的尾部 */ i = CH375ByteLocate(); mStopIfError( i );
串口打印顯示的是 測(cè)試開始 請(qǐng)插入U(xiǎn)盤后復(fù)位單片機(jī)........................... ok 檢查U盤是否準(zhǔn)備好.. ok
U盤容量為:3823 MB 然后就沒有了
再次在這句話停了,i = CH375FileOpen(); 這個(gè)函數(shù)具體怎么實(shí)現(xiàn)的呢,還是我買的硬件有問題?因?yàn)閯倢W(xué),什么都不懂,又很容易放棄,只能逼著自己抓緊問你們了,謝謝了
不會(huì)發(fā)圖,只能打了, 硬件連接圖是這樣的 1 INT# 聯(lián)到兩排端子上 2 RST1 0.47uF接3.3V 3 WR# 聯(lián)到兩排端子上 4 RD# 聯(lián)到兩排端子上 5 TXD 接GND 6 RXD 未接 8 A0 聯(lián)到兩排端子上 9 V3 接10nF到地 10 UD+ 接usb母口的D+ 11 UD- 接usb母口的D- 12 GND 13,14 12M晶振和22pf電容 15-22 聯(lián)到兩排端子上 23 GND 24 ACT#接1K接燈到3.3 25 26空 27 CS# 聯(lián)到兩排端子上 28 3.3V
CH375FileOpen()這個(gè)函數(shù)的實(shí)現(xiàn)在我們庫(kù)里面,首先你最好監(jiān)控一下CH375DiskReady() 這個(gè)函數(shù)的返回值,是否為0才退出,其次中斷是怎么處理的?插上U盤INT有沒有拉低?有沒有進(jìn)入你的則的函數(shù)?
1 首先CH375DiskReady() 這個(gè)函數(shù)的返回值確定是0, 2 其次中斷是怎么處理的?不太明白這個(gè)意思,用的庫(kù)是ch375hfc mCopyCodeStringToXRAM( mCmdParam.Open.mPathName, "/XP.TXT" ); i = CH375FileOpen(); // 打開文件 所以就不知道這句話是怎么進(jìn)中斷的,我感覺是沒進(jìn)去。因?yàn)镮NT#未拉低 3 插上U盤INT有沒有拉低?有,確定 4 有沒有進(jìn)入你的則的函數(shù)?我的子函數(shù)?不太明白你的意思,我感覺現(xiàn)在這樣的,插上U盤后INT拉低了,但是在CH375FileOpen();這句話時(shí)應(yīng)該進(jìn)中斷是嗎?但是沒進(jìn),X寶買的模塊,我也不確定是否硬件有問題
前面初始化正常通過,應(yīng)該硬件沒什么問題。感覺還是你的RAM的問題,導(dǎo)致進(jìn)入CH375FileOpen(),程序跑飛了,沒有等到中斷。