【发布时间】:2019-06-03 08:14:18
【问题描述】:
我想在 Linux 和 Windows 上以一致的方式从串行端口读取数据。我注意到read() 和ReadFile() 的行为略有不同。考虑以下代码:
// on Linux
int r = read(fd, buf, 256);
// on Windows
ReadFile(handle, buf, 256, &r, NULL);
这两个函数都将永远阻塞,直到数据到达。到目前为止,一切都很好。但是,有一点区别:read() 将在至少 1 个字节到达后立即返回,而 ReadFile() 在所有 256 个字节到达之前不会返回。
因此,我想问一下:有没有办法让ReadFile() 在Linux 上表现得像read(),即即使请求了256 个字节,只要至少有1 个字节就返回?
【问题讨论】:
-
你为什么不能在你的windows代码中也使用
read()? -
将第三个参数改为
1,循环读取,直到有256个字节。 -
另外,IIRC,您可以使用
COMMTIMEOUTS将所有超时值设置为0。 -
您需要调用
SetCommTimeouts- 如果应用程序将 ReadIntervalTimeout 和 ReadTotalTimeoutMultiplier 设置为 MAXDWORD 并将 ReadTotalTimeoutConstant 设置为大于零且小于 MAXDWORD 的值,则在 ReadFile 函数时会发生以下情况之一被调用:如果输入缓冲区中有任何字节,ReadFile 立即返回缓冲区中的字节。如果输入缓冲区中没有字节,ReadFile 会等到一个字节到达,然后立即返回。 -
@Andreas 在这种情况下,请尝试在循环中调用
ReadFile()。如果读取任何字节,则中断循环。否则,如果读取超时,请再次调用ReadFile()以获取新的超时间隔。
标签: c winapi serial-port