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

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM