使用CH376能否实现文件拷贝

使用CH376能否实现文件拷贝?就是实现任意文件从U盘一目录复制到另外的目录下?最近在做类似的项目,谢谢

这个是可以实现的,在做的时候只需要一个读取文件之后关闭文件,在打开另一个文件写数据,在读写的过程中不断的时候LOCATE命令进行跳转,直至文件拷贝完成。


是这样的,今天晚上做出了了,能够拷贝图片和PDF文档,但是发现拷贝一个366Kb的文件需要差不多20秒,速度不到20K字节/S,是不是太慢了,用的是硬件SPI,速度有18MB/S,发现速度再快就有错误了,问什么这么慢呢


缓冲区为640字节,是不是太小了


你是采用扇区方式读写吗?另外速度的话跟你的单片机主频和使用的传输方式有关


使用的是字节读取方式,如果使用扇区读写方式的话,缓冲区应该是一个扇区的倍数吧?


是的 需要你有足够的RAM,我们的例子程序是16K的RAM。


使用扇区方式读写时发现,每次读出100个扇区,开始的时候是正确的,后来就不对了,不到100个,但是显然源文件数据刚读取了一点点,就不正确了,这是为什么呢,一下是一段扇区方式读取文件的代码:

以下是部分程序代码 (CH376_DAT_BLOCK_LEN 为64,sizeof(buf) = 6400) ByteCount = 0; sec_num = sizeof(buf)/ DEF_SECTOR_SIZE; //一次可以处理的总扇区 do{ strcpy(SrcName, FILENAME); s = CH376FileOpen(SrcName); /* 打开文件 */ if ( s != USB_INT_SUCCESS ) mStopIfError( s ); s = CH376SecLocate( ByteCount/CH376_DAT_BLOCK_LEN ); /* 以扇区为单位移动当前文件指针到上次复制结束位置 */ 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); /* 关闭文件 */ if ( s != USB_INT_SUCCESS ) mStopIfError( s ); ByteCount += ThisSecLen*CH376_DAT_BLOCK_LEN; //已经读出的总字节 printf( "read ThisSecLen = %ld\r\n",ThisSecLen); //打印每次读出实际扇区数 printf( "ByteCount=%ld,FileSize=%ld\r\n", ByteCount,FileSize ); //打印已经读出字节数与文件总数 }while(ByteCount 一下是串口助手打印的数据: 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


你的函数中s = CH376SecRead( buf, sec_num , &ThisSecLen );ThisSecLen 是怎么定义的?


局部变量 UINT16 ThisSecLen = 0; //实际写入的字节数


感觉你ThisSecLen有点问题,我用s = CH376SecRead( buf, sec_num , NULL); ByteCount += 100*CH376_DAT_BLOCK_LEN;是可以操作通过的。


谢谢您的回答。使用s = CH376SecRead( buf, sec_num , &ThisSecLen )是怕出现实际写入数据小于请求数据的情况,使用NULL后发现写一个375KB的数据最后只写了362KB,出现拷贝数据出错的问题


丢数据是因为你sec_num = sizeof(buf)/ DEF_SECTOR_SIZE;真实的计算值是12.5,因为你的sec_num类型是整型所以的扇区读里面的sec_num是12,这样会导致丢数据。


您说的对,问题解决了,我把CH376_DAT_BLOCK_LEN 和DEF_SECTOR_SIZE给搞混了,真是太粗心了!


只有登录才能回复,可以选择微信账号登录