【问题标题】:ReadFile Timeout for inter-byte delay time字节间延迟时间的 ReadFile Timeout
【发布时间】:2014-11-18 16:16:52
【问题描述】:

我希望ReadFile() 与串行通信设备在收到至少一个字节或超时时返回。

正如我一直在寻找关于 ReadFile() 的超时。

大多数人提到SetCommTimeouts()overlapped I/O

但是SetCommTimeouts() 没有返回,但接收到一个字节,直到超时。

overlapped I/O(GetOverlappedResult) 也不能满足我的要求。对吧?

但是我知道GetOverlappedResultEx() 似乎支持这一点,使用DWORD dwMilliseconds 参数,我不想使用EX 系列函数。

有什么办法吗?

【问题讨论】:

  • “我不想使用 EX 系列功能。”:为什么?许多核心 Win32 API 以 Ex 结尾。
  • 你可以使用'select'函数,有一个超时,然后当字符可用或超时时返回。它返回一个值,指示发生了什么。
  • 但正如它在 Windows 中所知,select 仅适用于套接字。没有?

标签: c++ c windows serial-port


【解决方案1】:

您必须通过指定FILE_FLAG_OVERLAPPED 来使用该函数的异步版本。

当达到超时时,您可以使用文件句柄调用CancelIo

HANDLE hThread = CreateThread(NULL, 0, TizReadFile, tizHandle, 0, 0);
WaitForSingleObject(hThread, 2);
CancelIo(tizHandle);
...
DWORD WINAPI TizReadFile(HANDLE &tizHandle)
{
    DWORD dwRead = 0;
    if(0 == ReadFile(tizHandle, g_globalBuffer, dwWant2Read, &dwRead, 0))
        return GetLastError();
    return 1;
}

【讨论】:

    猜你喜欢
    • 2013-11-22
    • 2011-03-26
    • 2011-02-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-26
    • 2011-10-08
    • 2011-01-11
    相关资源
    最近更新 更多