我正在使用文件描述符和 posix/unix read() 函数从 C++ 中的串行端口读取字节。在此示例中,我从串行端口读取 1 个字节(为清楚起见,省略了波特率设置和类似设置):
#include <termios.h>
#include <fcntl.h>
#include <unistd.h>
int main(void)
{
int fd = open("/dev/ttyS0", O_RDWR | O_NOCTTY);
char buf[1];
int bytesRead = read(fd, buf, 1);
close(fd);
return 0;
}
如果连接到 /dev/ttyS0 的设备没有发送任何信息,程序将挂起。如何设置超时?
我试过这样设置超时:
struct termios options;
tcgetattr(fd, &options);
options.c_cc[VMIN] = 0;
options.c_cc[VTIME] = 10;
tcsetattr(fd, TCSANOW, &options);
我认为它应该给 1 秒超时,但它没有区别。我想我误解了 VMIN 和 VTIME。VMIN 和 VTIME 是做什么用的?
然后我在网上搜索,发现有人在谈论 select() 函数。那是解决方案吗?如果是这样,如何将其应用于上面的程序以使 1 秒超时?
任何帮助表示赞赏。提前致谢 :-)