【问题标题】:How to setup timeout reading USB port in C++ (VS2010)?如何在 C++ (VS2010) 中设置超时读取 USB 端口?
【发布时间】:2018-11-03 17:52:34
【问题描述】:

我正在打开并从 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一样的效果?

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

我在 Windows 10 中使用 Visual Studio 2010。

感激不尽。

【问题讨论】:

  • 我对windows了解不多,但胡乱猜测——IO Completion Port能帮上忙吗?
  • 你需要创建异步句柄。结果ReadFile 没有阻塞。您可以随时取消通话

标签: c++ windows visual-studio usb thermal-printer


【解决方案1】:

首先这里的任何 Visual Studio 都绝对不相关。

一般解决方案 - 使用异步 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);
    }

【讨论】:

    猜你喜欢
    • 2012-08-29
    • 1970-01-01
    • 2018-11-23
    • 1970-01-01
    • 2012-05-18
    • 2015-12-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多