CH573USB模拟串口的过程中,64字节的数据发送问题

CH573USB模拟串口,从上位机发送64字节长度的数据给CH573,然后CH573重新发送64字节长度的数据给上位机,这一串64字节长度的数据最后好像并没有去发送上位机,会存储在缓冲区,等待下一次再发送给上位非64字节长度的数据后,一起发送给上位机。这种问题该如何解决?

网上搜索了一下,应该无法发送给上位机64整数倍的数据,64整数倍的数据,没有满足通讯结束的条件,所以就不会从缓冲区发到上位机。那么该如何解决呢?我用的CH573的USB模拟串口



可以试一下在传输完第一次64字节之后,上传一个0长度的IN包给电脑


USB上传都是主机主动获取的,从机只负责准备数据等主机取走,你说的没有取走的问题,要看下是不是主机取的慢了或者主机满足什么条件后才向设备发送IN包


谢谢两位老师~我这边的问题就是当CH573从上位机接收到的数据长度为64时,将这64长度的数据拷贝到EP2的发送缓冲区(最大64字节)中。然后开始DevEP2_IN_Deal(),即MASK_UEP_T_RES ACK后,这时候USB会把EP2的发送缓冲寄存器中的数据发送fifo中,根据USB的协议,发送到fifo中的数据包长度需要在0~63字节内,才会认为数据发送结束,然后才会把fifo中的数据发送给上位机。


TECH5:可以试一下在传输完第一次64字节之后,上传一个0长度的IN包给电脑

RE:按照TECH5的建议,上位机可以接收到,但是有新的问题就是,当上位机发送给CH573的数据大于64字节,比如96字节时,CH573第一次USB传输中断out里面EP2的接收缓冲区的数据为64长度的字节,这个时候也要发送到fifo中,但这个时候不希望“在传输完第一次64字节之后,上传一个0长度的IN包给电脑”,因为第二次CH573USB传输中断out里面的接收缓冲区的数据长度为32,满足USB通信协议通讯结束的条件,如果提前上传一个0长度的IN包,不就提前结束了通信么?



☆怎么样可以从一开始就能获得到从上位机下传到CH573的总的数据长度?

或者如何将超过64字节的数据通过多次USB中断拆开,不发送给上位机,存储起来?


除非定义软件协议,告知主机要发送长度,否则就是没有总长度信息的,一般USB传输尽量都按照满包满包,非满包,认为是结束。
你的这个问题,最好加软件协议,自定义数据格式信息。


有没有例程可以参考一下,处理大于64字节的USB传输处理的


从机处理没差别,就是有数据就往缓冲区里面放,设置ACK,等主机取走,继续填入下一包。


TECH13从机处理没差别,就是有数据就往缓冲区里面放,设置ACK,等主机取走,继续填入下一包


那上位机下传到从机的数据为64整数倍字节长度的时候,怎么判断为最后一包数据包。如果非64整数倍包,可以根据包的数据长度小于64,判断可以最后一包。但是如果是64整数倍字节长度的时候,就没办法判断。本人就是在这里遇到的问题,不知道如何解决了。没有一个例程处理这种情况的么?应该都会遇到吧,正好64整数倍的时候,怎么判断当前的64整数倍的包为最后一包


如果不加自定义长度协议,是区分不了的。


您好,针对您遇到的问题可参考以下做法:

在单片机程序中设定一个USB数据上传等待时间,比如设定一个2ms的定时器。当上传给USB主机的数据包长度等于端点大小(本例为64byte),则启动该定时器。

1、若2ms定时时间到仍没有其他数据需要上传,则发送一包0长度USB包告知主机此次传输提前结束。

2、若2ms定时时间未到又有新数据要上传,则继续上传新的USB包而无需上传0长度包。


原因说明:

当USB主机请求的读长度为设备端点大小的整数倍时,此时主机读请求结束的判断条件为:

1、此次读取的USB包长度小于端点大小(即短包,包括0长度);

2、累计读取的USB包总长度达到主机请求的长度;



好的 谢谢TECH39 


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