我有一个 C++ 串行端口类,它具有无阻塞和阻塞模式用于读取操作。对于阻塞模式:
COMMTIMEOUTS cto;
GetCommTimeouts(m_hFile,&cto);
// Set the new timeouts
cto.ReadIntervalTimeout = 0;
cto.ReadTotalTimeoutConstant = 0;
cto.ReadTotalTimeoutMultiplier = 0;
SetCommTimeouts(m_hFile,&cto)
对于非阻塞模式:
COMMTIMEOUTS cto;
GetCommTimeouts(m_hFile,&cto);
// Set the new timeouts
cto.ReadIntervalTimeout = MAXDWORD;
cto.ReadTotalTimeoutConstant = 0;
cto.ReadTotalTimeoutMultiplier = 0;
SetCommTimeouts(m_hFile,&cto)
我想添加另一种模式来等待任意数量的字节并读取它们。
来自 MSDN COMMTIMEOUTS 结构:
如果应用程序将ReadIntervalTimeout和ReadTotalTimeoutMultiplier设置为MAXDWORD并将 ReadTotalTimeoutConstant 设置为大于零且小于 MAXDWORD 的值,则在调用 ReadFile 函数时会发生以下情况之一:
- 如果输入缓冲区中有任何字节,ReadFile 会立即返回缓冲区中的字节。
- 如果输入缓冲区中没有字节,ReadFile 会等到一个字节到达,然后立即返回。
- 如果在 ReadTotalTimeoutConstant 指定的时间内没有字节到达,ReadFile 超时。
这看起来像这样的代码:
COMMTIMEOUTS cto;
GetCommTimeouts(m_hFile,&cto);
// Set the new timeouts
cto.ReadIntervalTimeout = 100;
cto.ReadTotalTimeoutConstant = MAXDWORD;
cto.ReadTotalTimeoutMultiplier = MAXDWORD;
SetCommTimeouts(m_hFile,&cto)
但这会在第一个字节上返回。这是一个问题,因为我正在循环读取端口,并且字节的处理速度非常快,以至于下次我读取端口时,只有另一个字节可用。最终结果是我在循环中一次读取一个字节,并使用 100% 的内核运行该线程。
我想使用cto.ReadIntervalTimeout
MSDN 文档中的类似内容,但仍要等到至少一个字节可用。有人有想法吗?
谢谢。