spr*_*ite 3 c++ winapi serial-port communication
我有一个 C++ 串行端口类,它具有无阻塞和用于读取操作的阻塞模式。对于阻塞模式:
COMMTIMEOUTS cto;
GetCommTimeouts(m_hFile,&cto);
// Set the new timeouts
cto.ReadIntervalTimeout = 0;
cto.ReadTotalTimeoutConstant = 0;
cto.ReadTotalTimeoutMultiplier = 0;
SetCommTimeouts(m_hFile,&cto)
Run Code Online (Sandbox Code Playgroud)
对于非阻塞模式:
COMMTIMEOUTS cto;
GetCommTimeouts(m_hFile,&cto);
// Set the new timeouts
cto.ReadIntervalTimeout = MAXDWORD;
cto.ReadTotalTimeoutConstant = 0;
cto.ReadTotalTimeoutMultiplier = 0;
SetCommTimeouts(m_hFile,&cto)
Run Code Online (Sandbox Code Playgroud)
我想添加另一种等待任意数量字节并读取它们的模式。
从 MSDN COMMTIMEOUTS 结构:
如果应用程序将ReadIntervalTimeout和ReadTotalTimeoutMultiplier 设置为MAXDWORD并将ReadTotalTimeoutConstant设置为大于零且小于MAXDWORD 的值,则在调用 ReadFile 函数时会发生以下情况之一:
这看起来像这样的代码:
COMMTIMEOUTS cto;
GetCommTimeouts(m_hFile,&cto);
// Set the new timeouts
cto.ReadIntervalTimeout = 100;
cto.ReadTotalTimeoutConstant = MAXDWORD;
cto.ReadTotalTimeoutMultiplier = MAXDWORD;
SetCommTimeouts(m_hFile,&cto)
Run Code Online (Sandbox Code Playgroud)
但这会在第一个字节上立即返回。这是一个问题,因为我正在循环读取端口,并且字节的处理速度非常快,以至于下次我读取端口时,只有另一个字节可用。最终结果是我在循环中一次读取一个字节,并使用 100% 的内核运行该线程。
我想cto.ReadIntervalTimeout在 MSDN 文档中使用类似的东西,但仍然要等到至少有一个字节可用。有没有人有想法?
谢谢。
你想要的行为将来自:
cto.ReadIntervalTimeout = 10;
cto.ReadTotalTimeoutConstant = 0;
cto.ReadTotalTimeoutMultiplier = 0;
Run Code Online (Sandbox Code Playgroud)
它为第一个字节阻塞任意长(根据文档,通过将后两个字段设置为零来禁用总超时),然后只要数据流入就读取缓冲区大小。如果数据中有 10 毫秒的间隙,它将返回到目前为止已收到的内容。
| 归档时间: |
|
| 查看次数: |
24052 次 |
| 最近记录: |