Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/139.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 丢失事件信号?_C++_Winapi_Usb_Hid - Fatal编程技术网

C++ 丢失事件信号?

C++ 丢失事件信号?,c++,winapi,usb,hid,C++,Winapi,Usb,Hid,我正试图通过USB向外部设备发送消息并从中接收消息 它与HidD_GetInputReport()和HidD_SetOutputReport()配合使用效果良好。问题是,当我发送命令时,我会有一些临时延迟,因为我正在与之交谈的设备需要一些时间来响应和填充应答缓冲区。我们想摆脱这种拖延 我研究了使用ReadFile()和WriteFile()API的选项 我写了一个这样的文件: DWORD bytesRead; OVERLAPPED osWrite = { 0 }; osWrite.h

我正试图通过USB向外部设备发送消息并从中接收消息

它与HidD_GetInputReport()和HidD_SetOutputReport()配合使用效果良好。问题是,当我发送命令时,我会有一些临时延迟,因为我正在与之交谈的设备需要一些时间来响应和填充应答缓冲区。我们想摆脱这种拖延

我研究了使用ReadFile()和WriteFile()API的选项

我写了一个这样的文件:

DWORD       bytesRead;
OVERLAPPED osWrite = { 0 };
osWrite.hEvent = CreateEvent(NULL, TRUE, FALSE, NULL);
bool success = WriteFile(Device, packetBuffer, packetLength, &bytesRead, &osWrite);
if ( false == success )
{
    WaitForSingleObject(osWrite.hEvent, INFINITE);
    if (!GetOverlappedResult(Device, &osWrite, &bytesRead, TRUE))
    {
        printf("write failed \n");
        GetErrorMessage();
    }
    else
    {
        printf("write passed \n");
    }
    success = TRUE;
}

CloseHandle(osWrite.hEvent);
WriteFile工作正常。与我通话的设备接收我的信息,然后作出响应

然后我执行ReadFile()以获取该信息。以下是用于此目的的代码片段:

DWORD       bytesRead;
OVERLAPPED osReader = { 0 };
    
osReader.hEvent = CreateEvent(NULL, TRUE, FALSE, NULL);

bool success = ReadFile(Device, packetBuffer, packetLength, &bytesRead, &osReader);
    
if ( success == false)
{
    if (!GetOverlappedResult(m_hDevice, &osReader, &bytesRead, TRUE))
    {
        GetErrorMessage();
    }
}
我们也收到了回复。因此,它工作得很好,但有时(对于某些特定的命令),如果设备需要一段时间来响应,主机端似乎一直在等待信号,并且从不继续。我已经确认设备最终会有响应(比如10秒后),但主机似乎从未收到信号。我使用匿名事件来确保它不会被任何其他进程吃掉

所以,我们只是停留在
if(!GetOverlappedResult(m_hDevice,&osReader,&bytesRead,TRUE))

是否有人能提供任何关于我遗漏了什么的信息,或者是否有不正确的地方

FWIW,这就是我创建设备的方式

 Device = CreateFile( Path,
                            GENERIC_READ | GENERIC_WRITE,
                            FILE_SHARE_READ | FILE_SHARE_WRITE,
                            NULL,
                            OPEN_EXISTING,
                            FILE_FLAG_OVERLAPPED,
                            NULL);

你的代码无论如何都是错误的。您不检查结果或I/O。调用
GetOverlappedResult
仅在I/O返回的
ERROR\u IO\u PENDING
情况下才有意义。还有,为什么您打开文件时使用
file\u FLAG\u OVERLAPPED
,但实际上使用同步I/O?@RbMm我知道重叠和同步I/O并不能很好地结合在一起,因为它违背了重叠的I/O。这只是目前的一个要求,不会对正常操作造成任何问题。我确实检查了readfile响应,但它不包括在这里,并且它是错误IO挂起的。除此之外,您是否看到任何问题会导致它没有收到信号?我确实检查了readfile响应,但它不包括在这里-为什么在这种情况下不发布实际代码?波斯特的具体代码是错误的。如果读或写返回false-您需要在开始调用时调用
GetLastError()
。对于您在读取(无意义)后仍称之为
WaitForSingleObject
,而在写入后不执行此操作。再一次-或者使用真正的异步I/O-在I/O后不要等待到位,或者删除重叠的
文件\u标志。我认为这不是次要的细节。为什么
GetOverlappedResult
是无限等待?在具体代码中-如果
ReadFile
失败,但没有出现
错误\u IO_PENDING
-osReader.hEvent,则不会设置为result,如果请求未完成或同步失败(i/o返回false,但最后一个错误未处于挂起状态),则不会设置
GetOverlappedResult
无限等待
hEvent
。根据你的代码和信息-不可能给出另一个答案。他们确实响应了我们最初的要求——这一点是绝对不清楚的