请问一下, (1)CH372在用端点2批量接收完一次数据后,如果说存放数据的缓冲区已经满了,我应该给CH372传个啥东西啊? (2)在PDF中说数据接收完后,用命令释放当前缓冲区的意思是数据成功接收,给上位机返回一个ACK握手信号么?谢谢
(1)CH372的接收缓冲区满了但数据并没被单片机取走及解锁,这时PC继续下传的话,CH372会自动返回Nak,告诉PC正忙,这不需要应用层处理 (2)确切地说,是通知CH372停止返回Nak,这样PC可以继续下传数据
(1)按照您说的这样,在用RD_USB_DATA命令读取CH372缓冲区中的数据之后,CH372还是在自动向PC返回Nak,直到用CH372的解锁命令释放了缓冲区,则CH372停止向PC返回Nak,从而进行下次的数据传输。 (2)我在每次读取CH372的数据之后,都判断存放数据的缓冲区是否满了,如果满了则不释放CH372的缓冲区,而直接从外部中断中退出,在主程序中检测缓冲区的数据是否处理完了,处理完成之后,我再释放CH372的缓冲区,如果我一直不释放缓冲区,PC端是不是有个时间限制,重试多少次后,就不再传送数据了啊?
PC端有个超时机制,如果设置超时那么到时间还没有传成功就会退出,如果没设置的话,就一直死等。
(1)是的,确切的说是只要执行解锁命令命令后,CH372就停止向PC返回Nak,数据没取也没关系 (2)有超时限制,超时后不再重试
如果这样的话,这个超时限制大概多长啊?我的缓冲区开了5K,在通过端点2读数据存入缓冲区的时候,我怎么才能保证数据既不丢失而处理完一部分,然后再接收一部分啊?按照我上边的处理方法,检测到缓冲区满了,就不读端点2的数据,然后直接退出外部中断,而在主程序中检测缓冲区的数据处理完了再向CH372写入释放缓冲区的命令,程序会死掉。我不知道我这样处理到底对不对?能不能指点一下,谢谢
(1)这个超时是由用户根据需要通过CH375SetTimeout设定的,可以设置为不超时 (2)处理流程基本没问题,可以做个通讯协议: <1>PC发送一包数据后,等待单片机应答数据 <2>单片机收到数据,处理完毕后,给PC一个应答数据 <3>PC收到单片机应答数据后再发送下一包数据
1.CH375WriteData缓冲区最大支持4096,不要开5K,可能后面的1K传不下去。 2.CH375WriteData在底层驱动处理是,按64大小来传输的,如果第三个参数设置的传输量不是64的倍数,那前面都是按64大小来传输的,最后一个包就小于64;就算你最后一个包小于64,如果不给他解锁的话,PC端也是不会发数据把CH372剩余的缓冲区添满。 3.只有解锁了,PC才会发下一包。按照提供的流程做就可以了,不需要判断满不满的问题。
我现在是这样来接收上位机发来的数据:在单片机这端有一个外部RAM用保存从CH372读来的数据,外部RAM开辟的缓冲区为5K个单元。现在我在往外部RAM存数据的时候首先判断缓冲区是否满了,若未满则继续存;当缓冲区写入4K个字节的时候我就认为缓冲区满了,这时我在EP2_OUT处理时就只读数据,而不解锁缓冲区,在主程序中,前边的数据处理完了之后再解锁CH372的缓冲区,这时PC不是就应该继续给372发送数据了,但是单片机这头却死拉,不再接收数据拉。若我不判外部RAM是否满了,PC在不断的给372发送数据,而单片机进入中断又再不停的接收,PC发送的数据很快,有可能外部RAM的前边数据还没来得及处理又被新的数据给覆盖了,这样不就出错了么?
如果不解锁的话,PC是无法发送数据了,CH372当然也就接不到数据了.是正确的.
(1)“单片机死机”的原因分析过没? (2)按6楼帖做个通讯协议,就不会存在“前边数据还没来得及处理又被新的数据给覆盖了”这样的情况了