在项目过程中用 WinUsb_ReadPipe函数异步读取usb device数据;用
WinUsb_GetOverlappedResult()函数获取读取的结果长度;测试demo的数据长度是从1056byte 按8byte 步长往上涨的, 当跑到2MB+1032byte的时候,上位机就会少收取8字节就结束了,而少收的这8字节就进入到了下一次请求的结果中;用usb分析仪抓包下位机发送的数据并没有错误;
遇到问题不会就是百度啊,这是万能的解决方法,遇到这一篇帖子基于WinUSB的异步方式bulk传输的稳定性问题_褐色狸花猫的博客-CSDN博客_usb的通信稳定性
猜测,这个问题肯定与WinUsb_SetPipePolicy有关,果不其然,还真与其有关;
微软官方文档中对于管道策略(用于管道策略修改的 WinUSB 函数 - Windows drivers | Microsoft Docs)的介绍有这么一个参数:
对于这个参数的解释如下:
于是使用WinUsb_SetPipePolicy()将管道策略设置成了IGNORE_SHORT_PACKETS,问题就完美解决了。
ULONG timeout;
timeout = TRUE;
WinUsb_SetPipePolicy(usbInterface->usbHandle, 0x87, IGNORE_SHORT_PACKETS, sizeof(ULONG), &timeout);
BOOL WinUsb_ReadPipe(
[in] WINUSB_INTERFACE_HANDLE InterfaceHandle,
[in] UCHAR PipeID,
[out] PUCHAR Buffer,
[in] ULONG BufferLength,
[out, optional] PULONG LengthTransferred,
[in, optional] LPOVERLAPPED Overlapped
);
BOOL WinUsb_GetOverlappedResult(
[in] WINUSB_INTERFACE_HANDLE InterfaceHandle,
[in] LPOVERLAPPED lpOverlapped,
[out] LPDWORD lpNumberOfBytesTransferred,
[in] BOOL bWait
);
BOOL WinUsb_SetPipePolicy(
[in] WINUSB_INTERFACE_HANDLE InterfaceHandle,
[in] UCHAR PipeID,
[in] ULONG PolicyType,
[in] ULONG ValueLength,
[in] PVOID Value
);