如何在C++(VS2010)中设置超时读取USB端口?



我正在打开并从USB设备(热敏打印机(读取端口:

HANDLE hUsb = CreateFile(symbolicName,
GENERIC_READ | GENERIC_WRITE, 
0, 
NULL, 
OPEN_EXISTING, 
0, 
NULL);
ReadFile(hUsb, buffer, bytes, &read, NULL);

我需要设置超时才能读取,但它是 USB 端口,而不是 COM 端口,所以我无法使用 SetCommTimeout 函数。

是否有任何函数可供我使用并具有与 SetCommTimeout 相同的效果?

如果有一个简单的方法,我宁愿不使用线程。

我正在使用Visual Studio 2010和Windows 10。

感激。

首先,这里的任何Visual Studio都是绝对无关的。

常规解决方案 - 使用永远不会阻塞的异步 IO。 您可以自己取消 IO 操作 通过一些超时。 当然设置计时器(通过CreateTimerQueueTimer(并在计时器回调中取消IO的好方法。 或者如果 IO 将在此之前完成 - 取消计时器。 但是,如果想要最简单的实现,就地执行同步IO - 可以做下一步:

inline ULONG BOOL_TO_ERROR(BOOL f)
{
return f ? NOERROR : GetLastError();
}
//------------------------------------------------------------------------
HANDLE hFile = CreateFileW(symbolicName, FILE_GENERIC_READ, FILE_SHARE_READ, 0, OPEN_EXISTING,
FILE_FLAG_OVERLAPPED, 0);
if (hFile != INVALID_HANDLE_VALUE)
{
OVERLAPPED ov = {};
if (ov.hEvent = CreateEventW(0, 0, 0, 0))
{
char buf[16];
ULONG NumberOfBytesRead = 0;
ULONG err = BOOL_TO_ERROR(ReadFile(hFile, buf, sizeof(buf), 0, &ov));
switch (err)
{
case ERROR_IO_PENDING:
if (WaitForSingleObject(ov.hEvent, timeout) != WAIT_OBJECT_0)
{
CancelIo(hFile);
}
case NOERROR:
err = BOOL_TO_ERROR(GetOverlappedResult(hFile, &ov, &NumberOfBytesRead, TRUE));
break;
}
CloseHandle(ov.hEvent);
}
CloseHandle(hFile);
}

最新更新