在Linux下使用串口通信時,默認的阻塞模式是不實用的。而采用select或epoll機制的非阻塞模式,寫代碼有比較麻煩。幸好Linux的串口自己就帶有超時機制。
Linux下使用termios.h中的的接口進行串口設置。具體的波特率,數據位等屬性的設置在這就不詳細說明了,百度上很多。
使用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*/
VTIME和VMIN需配合使用,它們的組合關系如下:
1、VTIME=0,VMIN=0:此時即使讀取不到任何數據,函數read也會返回,返回值是0。
2、VTIME=0,VMIN>0:read調用一直阻塞,直到讀到VMIN個字符后立即返回。
3、VTIME>0,VMIN=0:read調用讀到數據則立即返回,否則將為每個字符最多等待 VTIME*100ms 時間。
4、VTIME>0,VMIN>0:read調用將保持阻塞直到讀取到第一個字符,讀到了第一個字符之后開始計時,此后若時間到了 VTIME*100ms 或者時間未到但已讀夠了VMIN個字符則會返回。若在時間未到之前又讀到了一個字符(但此時讀到的總數仍不夠VMIN)則計時重新開始(即每個字符都有VTIME*100ms的超時時間)。