如何在 C++ (VS2010) 中设置超时读取 USB 端口?
How to setup timeout reading USB port in C++ (VS2010)?
我正在打开并从 USB 设备(热敏打印机)读取端口:
HANDLE hUsb = CreateFile(symbolicName,
GENERIC_READ | GENERIC_WRITE,
0,
NULL,
OPEN_EXISTING,
0,
NULL);
ReadFile(hUsb, buffer, bytes, &read, NULL);
我需要设置超时才能读取,但它是USB端口,不是COM端口,所以我不能使用函数SetCommTimeouts。
有没有我可以使用的功能,并且具有与 SetCommTimeouts 相同的功能?
如果有简单的方法,我宁愿不用线程。
我正在使用 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);
}
我正在打开并从 USB 设备(热敏打印机)读取端口:
HANDLE hUsb = CreateFile(symbolicName,
GENERIC_READ | GENERIC_WRITE,
0,
NULL,
OPEN_EXISTING,
0,
NULL);
ReadFile(hUsb, buffer, bytes, &read, NULL);
我需要设置超时才能读取,但它是USB端口,不是COM端口,所以我不能使用函数SetCommTimeouts。
有没有我可以使用的功能,并且具有与 SetCommTimeouts 相同的功能?
如果有简单的方法,我宁愿不用线程。
我正在使用 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);
}