使用CH376能否實(shí)現(xiàn)文件拷貝?就是實(shí)現(xiàn)任意文件從U盤一目錄復(fù)制到另外的目錄下?最近在做類似的項(xiàng)目,謝謝
這個(gè)是可以實(shí)現(xiàn)的,在做的時(shí)候只需要一個(gè)讀取文件之后關(guān)閉文件,在打開另一個(gè)文件寫數(shù)據(jù),在讀寫的過程中不斷的時(shí)候LOCATE命令進(jìn)行跳轉(zhuǎn),直至文件拷貝完成。
是這樣的,今天晚上做出了了,能夠拷貝圖片和PDF文檔,但是發(fā)現(xiàn)拷貝一個(gè)366Kb的文件需要差不多20秒,速度不到20K字節(jié)/S,是不是太慢了,用的是硬件SPI,速度有18MB/S,發(fā)現(xiàn)速度再快就有錯(cuò)誤了,問什么這么慢呢
緩沖區(qū)為640字節(jié),是不是太小了
你是采用扇區(qū)方式讀寫嗎?另外速度的話跟你的單片機(jī)主頻和使用的傳輸方式有關(guān)
使用的是字節(jié)讀取方式,如果使用扇區(qū)讀寫方式的話,緩沖區(qū)應(yīng)該是一個(gè)扇區(qū)的倍數(shù)吧?
是的 需要你有足夠的RAM,我們的例子程序是16K的RAM。
使用扇區(qū)方式讀寫時(shí)發(fā)現(xiàn),每次讀出100個(gè)扇區(qū),開始的時(shí)候是正確的,后來就不對了,不到100個(gè),但是顯然源文件數(shù)據(jù)剛讀取了一點(diǎn)點(diǎn),就不正確了,這是為什么呢,一下是一段扇區(qū)方式讀取文件的代碼:
以下是部分程序代碼 (CH376_DAT_BLOCK_LEN 為64,sizeof(buf) = 6400) ByteCount = 0; sec_num = sizeof(buf)/ DEF_SECTOR_SIZE; //一次可以處理的總扇區(qū) do{ strcpy(SrcName, FILENAME); s = CH376FileOpen(SrcName); /* 打開文件 */ if ( s != USB_INT_SUCCESS ) mStopIfError( s ); s = CH376SecLocate( ByteCount/CH376_DAT_BLOCK_LEN ); /* 以扇區(qū)為單位移動(dòng)當(dāng)前文件指針到上次復(fù)制結(jié)束位置 */ if ( s != USB_INT_SUCCESS ) mStopIfError( s ); //printf( "Reading...\r\n" ); s = CH376SecRead( buf, sec_num , &ThisSecLen ); if ( s != USB_INT_SUCCESS ) mStopIfError( s ); s = CH376FileClose(TRUE); /* 關(guān)閉文件 */ if ( s != USB_INT_SUCCESS ) mStopIfError( s ); ByteCount += ThisSecLen*CH376_DAT_BLOCK_LEN; //已經(jīng)讀出的總字節(jié) printf( "read ThisSecLen = %ld\r\n",ThisSecLen); //打印每次讀出實(shí)際扇區(qū)數(shù) printf( "ByteCount=%ld,FileSize=%ld\r\n", ByteCount,FileSize ); //打印已經(jīng)讀出字節(jié)數(shù)與文件總數(shù) }while(ByteCount 一下是串口助手打印的數(shù)據(jù): read ThisSecLen = 100 ByteCount=6400,FileSize=375257 read ThisSecLen = 100 ByteCount=12800,FileSize=375257 read ThisSecLen = 100 ByteCount=19200,FileSize=375257 read ThisSecLen = 100 ByteCount=25600,FileSize=375257 read ThisSecLen = 100 ByteCount=32000,FileSize=375257 read ThisSecLen = 100 ByteCount=38400,FileSize=375257 read ThisSecLen = 100 ByteCount=44800,FileSize=375257 read ThisSecLen = 33 ByteCount=46912,FileSize=375257 read ThisSecLen = 1 ByteCount=46976,FileSize=375257 read ThisSecLen = 1 ByteCount=47040,FileSize=375257 read ThisSecLen = 1 ByteCount=47104,FileSize=375257
你的函數(shù)中s = CH376SecRead( buf, sec_num , &ThisSecLen );ThisSecLen 是怎么定義的?
局部變量 UINT16 ThisSecLen = 0; //實(shí)際寫入的字節(jié)數(shù)
感覺你ThisSecLen有點(diǎn)問題,我用s = CH376SecRead( buf, sec_num , NULL); ByteCount += 100*CH376_DAT_BLOCK_LEN;是可以操作通過的。
謝謝您的回答。使用s = CH376SecRead( buf, sec_num , &ThisSecLen )是怕出現(xiàn)實(shí)際寫入數(shù)據(jù)小于請求數(shù)據(jù)的情況,使用NULL后發(fā)現(xiàn)寫一個(gè)375KB的數(shù)據(jù)最后只寫了362KB,出現(xiàn)拷貝數(shù)據(jù)出錯(cuò)的問題
丟數(shù)據(jù)是因?yàn)槟鉺ec_num = sizeof(buf)/ DEF_SECTOR_SIZE;真實(shí)的計(jì)算值是12.5,因?yàn)槟愕膕ec_num類型是整型所以的扇區(qū)讀里面的sec_num是12,這樣會(huì)導(dǎo)致丟數(shù)據(jù)。
您說的對,問題解決了,我把CH376_DAT_BLOCK_LEN 和DEF_SECTOR_SIZE給搞混了,真是太粗心了!