我一次有多个WinUsb_ReadIsochPipeAsap在飞行,每次WinUsb_GetOverlappedResult成功的时候,总是排下一个队列。根据文档
WinUsb_ReadIsochPipeAsap允许USB驱动程序堆栈为传输选择起始帧号。如果端点上已经有一个或多个传输挂起,则将将传输调度为帧号,该帧号紧跟在上一个当前挂起的传输的最后一个帧号之后。
(强调后加)
当我测量主机上的数据速率(读取完成率)时,我只看到6 is的轮询率(每6帧),即使描述符bInterval是1,6ms甚至不是同步端点的可能轮询间隔。文档让我认为我应该看到每个帧上的传输,因为我总是有多个挂起的传输。
如果我用USB分析器查看总线,我看不到设备上的任何IN-NAK,所以我怀疑Windows甚至没有提出请求。
为什么我看不到整个1000赫兹的传输速率?
发布于 2017-05-26 00:47:53
WinUsb_ReadIsochPipeAsap的参数
BOOL __stdcall WinUsb_ReadIsochPipeAsap(
_In_ PWINUSB_ISOCH_BUFFER_HANDLE BufferHandle,
_In_ ULONG Offset,
_In_ ULONG Length,
_In_ BOOL ContinueStream,
_In_ PULONG NumberOfPackets,
PUSBD_ISO_PACKET_DESCRIPTOR IsoPacketDescriptors,
_In_opt_ LPOVERLAPPED Overlapped
);根据文档,ContinueStream的意思是:
ContinueStream [in]指示如果只能在最后一次挂起的传输之后的第一个帧中调度,则应该只提交。
(强调后加)
这是真的。例如,如果您对WinUsb_ReadIsochPipeAsap的第一次调用通过了TRUE,您将得到ERROR_INVALID_PARAMETER,因为没有什么可继续的。如果您允许超过1帧时间(全速1ms)并通过TRUE,您将得到ERROR_INVALID_PARAMETER,因为“最后挂起的传输后的第一个帧”不再可用。
然而,尽管默认行为是关于“最后一次未决传输后的第一帧”的非常相似的语言,但ContinueStream实际上将传输安排在顺序帧中的唯一方法是如果ContinueStream设置为 TRUE.无论您调用WinUsb_ReadIsochPipeAsap的速度有多快,或者您打了多少个重叠的电话,都不重要。
解决方案是始终尝试ContinueStream,但如果出现故障,请回到不继续的状态(否则,在第一个失败的ContinueStream之后,您将永远失败):
ContinueStream = FALSE;
while (...)
{
if ( !WinUsb_ReadIsochPipeAsap( ..., ContinueStream, ... ) )
{
DWORD lastError = GetLastError();
if ( lastError == ERROR_INVALID_PARAMETER && ContinueStream)
{
ContinueStream = FALSE;
continue;
}
}
ContinueStream = TRUE;
...
}或者,您可以重写您的循环以使用WinUsb_ReadIsochPipe (非sequential ),但这只需要您自己管理顺序帧号。
https://stackoverflow.com/questions/44191893
复制相似问题