Linux 串口中的超时设置
//初始化 //read调用读到数据则立即返回,否则将为每个字符最多等待 VTIME*100ms 时间. opt.c_cc[VTIME] = 1; opt.c_cc[VMIN] = 0; //接收 //用2个循环实现,第一个循环最多实现 3 次,300ms没有接收到数据则return; //第二个循环继续读后续的字节,每次读1Byte,直到无数据触发100ms超时退出; recv_len = 0; count = 0; while (1) { if (count > 3) { DBG_PRINT("HS_Get_Info read timeout.\n"); return -1; } ret = read(fd, recv_buff, 1); if (1 == ret) { recv_len++; break; } else if (ret < 0) { DBG_PRINT("HS_Send_Data read fail.\n"); return -1; } count++; } while (recv_len < (sizeof(recv_buff)-1)) { ret = read(fd, recv_buff+recv_len, 1); if (1 == ret) { recv_len++; } else if (0 == ret) { break; } else if (ret < 0) { DBG_PRINT("read fail.\n"); return -1; } }
使用termios.h的接口进行超时设置,主要是配置 VTIME 和 VMIN 两个字段。其中VTIME指定了等待的时间(timeout=VTIME*100ms),VMIN指定了读取字符的最小数量。
注意要使这两个字段生效,必须使串口工作于非标准模式。可以通过如下方式设置为RAW模式(非标准模式的一种,多用于通信):
/* struct termio newtio; */ newtio.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG); /*Input*/ newtio.c_oflag &= ~OPOST; /*Output*/