//初始化
//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*/