我想我找到了答案.
纯粹是巧合,我偶然发现了Keil论坛,我发现声明’HidD_SetOutputReport将使用控制端点,如果你想通过另一个端点,请使用WriteFile’.我知道5年多以前我曾经尝试过这条路,但我陷入了重叠结构的异步IO中.因为看起来我有一个出路(使用HidD_SetOutputReport)我放弃了WriteFile路径.所以现在是时候再次寻求这条道路了,我做到了.代码:
res = HidD_SetOutputReport(m_DeviceControl[dev],report,m_CapsControl[dev].OutputReportByteLength);
已被取代
DWORD bytesWritten;
OVERLAPPED eventWrite = {0};
eventWrite.hEvent = CreateEvent(NULL,TRUE,FALSE,NULL);
int rv3 = WriteFile(m_DeviceControl[dev],m_CapsControl[dev].OutputReportByteLength,&bytesWritten,&eventWrite);
if (rv3 == 0)
{
int err = GetLastError();
if (err == ERROR_IO_PENDING)
{
bool done = false;
do
{
// yes. Wait till pending state has gone
rv3 = WaitForSingleObject(eventWrite.hEvent,25);
if (rv3 == WAIT_OBJECT_0)
{
GetOverlappedResult(m_DeviceControl[dev],&eventWrite,FALSE);
done = true;
res = TRUE;
}
else if (rv3 == WAIT_TIMEOUT)
{
// Need to try again.
}
else
{
m_StoppingControlOut = true;
done = true;
}
}
while (!done && !m_StoppingControlOut);
}
}
}
这使得请求超过了正确的端点.
因此,我得出以下结论:
>我认为HID设备解释通过控制端点发送的OUT报告是错误的.>正确使用WriteFile(具有重叠的IO)使OUT报告使用正确的端点.