我想实现这样的功能:打开SD卡中的文件,读取80字节数据并发送出去,然后关闭文件,经过一段时间,再打开该文件,接着上次再读写80字节数据并发送。 我的问题是:第二次如何将文件指针定位到上次读写的位置?我尝试过了这样的方法:在第二次打开文件时,用字节偏移函数CH376ByteLocate( 80 );但是最终的结果表明还是从头开始读取。 我如果要想将文件指针定位到文件的任何位置,又该怎么做呢?
文件指针偏移就是调用CH376ByteLocate从指定位置读取数据,首先确保文件打开成功,CH376ByteLocate的返回值是否正确?
文件打开不成功,我用到了USB主机模式重置,原来是模式重置后要处理这个重置中断,我加入了一个读写376数据的函数,就可以了。我想应该是将中断状态读出来,这个中断状态就被消除了吧,这样就可以执行后面的文件打开操作了。我的理解若有不正确的地方,还请指点。
获取中断状态并取消中断请求是通过CMD01_GET_STATUS(0x22)命令来实现的。你重新设置模式后需要重新初始化。
还有一个问题,若未采用默认波特率,是否重新设置USB模式后波特率就回到了默认波特率? 根据我现在的调试情况,如果一直采用默认波特率,切换模式就没有问题,但是我如果重新设置了波特率,模式切换就不正常了,读写数据就不成功。
波特率的设置不会影响到模式切换,的具体看一下你是如何切换的?切换模式之后初始化能通过吗?
谢谢你的回答。我用的是STC89C52与CH376通信的,都是12M晶振。经过调试,现在我能确定确实不是模式切换的问题。目前从调试效果上看,是波特率会影响一些函数的执行时间。 我开始在375000bps的情况下调用了CH376GetFileSize()函数,经调试发现要等待23秒左右才会把这个函数执行完,我开始没注意到这点,以为程序没有执行了,其实只是执行得很慢。不知这是什么原因。 另外,我在375000bps时,发现执行CH376ByteRead()的时间与buf[]的大小有关,越小执行时间越短(几分钟到几秒),但是数据有时会发生错误,应该不是单片机RAM不够的原因,因为我用buf[4]读写数据都会出错,而我那个测试程序并不大。 还有一点,就是波特率为57600bps、128000bps时,读写是不成功的,这个我猜测是单片机实际产生的波特率与CH376实际产生的波特率偏差较大所致。 在波特率为9600时,不会出现以上任何问题。 关于在375000bps时执行上述两个函数时间慢的问题,应该不是单片机的问题,因为单片机在该波特率下执行其他程序块是很快的,不知是否是CH376本身在该波特率下被这两个函数访问时就会出现这种情况?
首先,波特率的改变肯定会肯定会影响函数的时间,但是波特率提高只会使执行时间缩短。其次,确保你改变波特率后,通讯接口能正常通讯,可以再做一下测试命令,有的单片机可能不支持较高传输速度。最后,设置成57600bps会有0.16%的误差但不影响通讯、128000bps你是如何设置的(这个波特率可能误差比较大会影响通讯)。
不好意思回复晚了,晚上才上网。正常通讯是可以的,我测试了初始化等函数,中断状态都是正常的,我用的这款单片机串口通讯波特率最大可达375kbps,并且用另外的程序测试通过了,现在就是那两个函数这种情况下执行很慢,我也不明白为什么波特率提高执行这两个函数执行时间反而变慢了,但通过设置标志位,发现其他部分比如向文件写数据的函数执行还是很快的。128000bps用的公式boderate=6000000/(256-常数),发分频系数、分频常数来设定。近几天暂时不调试那个模块了,过些天再仔细重新调一下,看看是函数内部的那个部分执行慢。还是希望能得到贵公司的悉心指点。