我在USB读取数据时用的是这个函数:
uint32_t USBHCDPipeRead(uint32_t ui32Pipe, uint8_t *pui8Data, uint32_t ui32Size);
发现如果缓冲区内没有数据还调用它的话 程序就进入死循环了,现在就是要读取大于64字节的不确定长度数据,读取的逻辑要怎么设计才能避免进入死循环?
程序大概是我这个主机发送指令,从机回复,但是数据长度不固定,大于64字节。
还有这个函数并不能正确读取uint32_t USBHCDPipeReadNonBlocking(uint32_t ui32Pipe, uint8_t *pui8Data,
uint32_t ui32Size);
xyz549040622:
我想了好久,这个问题我以前也想过,但貌似没有什么好的办法。由缓存区的大小决定的,接收的时候又不能判断你要发送多少。
如果缓冲区内没有数据还调用它的话 程序就进入死循环了,只能提前判断缓存区是否为空了。
user4619179:
回复 xyz549040622:
用USBHCDPipeRead读取的话,请求从机发送数据命令是从此函数内发送的,所以没法事先判断缓存区是否为空,应该还是要先确定接收长度的,不然就更改USBHCDPipeRead,让它检测一段时间(例如50ms),如果没有数据的话就退出。 另外如果要这样更改的话,那就最好别用DMA接收了,亲测过后,发现强制退出死循环后再有数据接收的话,读取出来的数据不准确。
附:MAP_USBHostRequestIN(USB0_BASE, ui32Endpoint); 就是这个函数触发从机发送数据的,在USBHCDPipeRead内。