如何对 USB HID 设备执行非阻塞写入?

问题描述 投票:0回答:1

我有一个被识别为 HID 外围设备的 USB 设备。我使用

ReadFile
WriteFile
Win32 API 函数与它进行通信。

设备有时会“卡住”并且没有响应,需要拔掉插头并重新插入。这本身并不是一个问题,但它会导致对

WriteFile
的调用阻塞,直到设备被拔掉,而这 是一个问题。

我读过可以使用重叠 I/O 来防止这种情况,但它不起作用。对

WriteFileEx
的呼叫仍然阻塞!

代码片段:

HANDLE hFCreateFileW(devicePath, NULL, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, NULL, NULL);
OVERLAPPED overlapped = {0};
overlapped.hEvent = CreateEvent(NULL, TRUE, FALSE, NULL);
if (!WriteFileEx(hFile, buffer, length, &overlapped, nullptr))
    return FALSE;
for (int elapsed = 0; !HasOverlappedIoCompleted(&overlapped); elapsed++) {
    std::this_thread::sleep_for(1ms);
    if (elapsed > READ_TIMEOUT_MS)
        return FALSE;
}

如何强制写入超时而不是永远阻塞?

(注意:该解决方案需要适用于从 XP 开始的所有 Windows 版本。)

timeout usb nonblocking hid overlapped-io
1个回答
0
投票

根据CreateFileW文档,需要在

FILE_FLAG_OVERLAPPED
参数中设置
dwFlagsAndAttributes
才能启用文件的非阻塞操作。

所以你应该打开文件为

HANDLE hFile = CreateFileW(devicePath, NULL, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_FLAG_OVERLAPPED, NULL);

否则,即使传递了

OVERLAPPED
,对文件的操作仍会被序列化。

© www.soinside.com 2019 - 2024. All rights reserved.