Windows — Как настроить время ожидания чтения USB-порта в 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.

Благодарный.

1

Решение

Прежде всего, любая Visual Studio здесь абсолютно не связана.

Общее решение — использовать асинхронный ввод, который никогда не блокируется. и вы можете самостоятельно отменить операцию ввода-вывода через некоторое время. хороший способ, конечно, установить таймер (через CreateTimerQueueTimer) и отмените ввод в обратный вызов таймера. или если 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);
}
1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]