我使用ubuntu作为主机,使用C ++作为语言。
我正在与使用逐行命令的串行设备进行通信。为此,我选择了规范的操作模式,我的termios
标志是:
fd = open(portName.c_str(), O_RDWR | O_NOCTTY | O_NDELAY);
struct termios config = { 0 };
config.c_iflag = IGNPAR | ICRNL;
config.c_oflag = 0;
config.c_lflag = ICANON;
config.c_lflag &= ~(ECHO | ECHONL | IEXTEN | ISIG);
config.c_cc[VINTR] = 0;
config.c_cc[VQUIT] = 0;
config.c_cc[VERASE] = 0;
config.c_cc[VKILL] = 0;
config.c_cc[VEOF] = 4;
config.c_cc[VTIME] = 0;
config.c_cc[VMIN] = 0;
config.c_cc[VSWTC] = 0;
config.c_cc[VSTART] = 0;
config.c_cc[VSTOP] = 0;
config.c_cc[VSUSP] = 0;
config.c_cc[VEOL] = 0;
config.c_cc[VREPRINT] = 0;
config.c_cc[VDISCARD] = 0;
config.c_cc[VWERASE] = 0;
config.c_cc[VLNEXT] = 0;
config.c_cc[VEOL2] = 0;
if(tcsetattr(fd, TCSAFLUSH, &config) < 0)
{
std::cout << "Error configuring serial." << std::endl;
}
简单的阅读完成如下:
char buffer[1024]; // 1024 bytes
read(fd, &buffer[0], 1024);
我的问题是,如果我疏忽了通信(即:当连接的设备断电时),我的read语句会挂起,程序会被阻止。
我需要暂停超时,在几秒钟后它将返回错误。据我所知,VTIME和VMIN对规范读取没有影响。
帮助理解如何为这样的读命令启用超时。