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*/

 

 

posted @ 2022-03-23 11:05  【黑手套】  阅读(1869)  评论(0编辑  收藏  举报