我正在使用文件描述符和 POSIX/Unix read() 函数从串行端口读取字节。在这个例子中,我从串行端口读取 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秒?
非常感谢您的帮助。提前致谢 :-)
tcsetattr()
的VTIME
并不直接,它需要其他模式设置,而一些串行驱动程序并不支持。请参见我的答案以获取通用解决方案。 - wallykoptions.c_cc[VMIN] = 0;
和options.c_cc[VTIME] = 10;
时,read()
函数应该在有一个或多个字节可用时返回,或者在超时时返回。在后一种情况下,read()
应该指示已读取 0 字节。 - hetepeperfan