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

