Linux 對於Serial Port的讀寫,是把該設備當成一個檔案,利用對檔案的存取達到對 Serial Port的讀寫動作。開檔案(open
file)的命令會回傳一個給Serial Port使用的檔案描述元(file
descriptor),藉由對各個不同的旗標設定,包括輸:入旗標、輸出旗標、設定旗標、區域模式旗標,達到對 Serial Port 的控制。
在 Linux Serial Programming HOW TO[20]這份文件中,對 Linux Serial
Port的輸入有3種不同的程序定義,如下:
1.標準輸入程序
這是終端機的標準處理程序,但用來與其他dl型式的以行為單位的輸入通訊也很有用,也就是 read
會傳回一整行完整的輸入資料。行預設的終止字元是 NL( ASCII LF
),檔案結束符,或行終止字元。預設環境下,CR(是DOS/Windows預設的行終止符)不會終止一行的敘述。標準的輸入處理程序還可以處理清除,刪除字,重印字元,及轉換CR為NL等等功能。
2.非標準輸入程序
非標準輸入程序可以用在需要每次讀取固定數量字元的情況,並允許使用字元輸入時間的計時器。這種模式可以用在讀取固定字元數量的應用程式,或者所連接的裝置會突然送出大量字元的狀況。
3.非同步式輸入
以上所敘述的兩種模式都可以用在非同步與同步的傳輸模式。預設是在同步的模式下工作,也就是在尚未讀取完之前,read
的狀態會被阻斷。而非同步模式下 read 的狀態會直接返回並送出訊號到所叫用的程式直到完成工作。這個訊號可以由訊號的處理程式 handler... 來接收。
非標準輸入程序
我們希望可以每次讀取固定字元數量,所以我們選用的輸入模式為第2種非標準輸入程序。在非標準的輸入程序模式下輸入的資料不會被組合成一行而輸入後的處理功能(清除、殺掉、刪除等等都)不能使用。
這個模式有兩個功能控制參數:c_cc[VTIME] 設定字元輸入時間計時器,及 c_cc[VMIN] 設定滿足讀取功能的最低字元接收個數。
如果 MIN>0 且 TIME=0 ,MIN
設定為滿足讀取功能的最低字元接收個數。由於 TIME 是 0,所以計時器將不被使用。
如果 MIN=0
且 TIME>0 ,TIME 將 被當做逾時設定值 。滿足讀取功能的情況為讀取到單一字元,或者超過TIME所定義的時間(t =
TIME * 0.1s)。如果超過 TIME 所定義的時間,則不會傳回任何字元。
如果
MIN>0 且 TIME>0 ,TIME 將被當做一個分割字元組的計時器。滿足讀取功能的條件為接收到 MIN
個數的字元,或兩個字元的間隔時間超過 TIME 所定義的值。計時器會在 每讀到一個字元後重新計時 ,且只會在第一個字元收到後才會啟動。
如果 MIN=0 且 TIME=0
,讀取功能就馬上被滿足。目前所存在的字元組個數,或者將回傳的字元組個數。
只要藉由修改
newtio.c_cc[VTIME] 以及 newtio.c_cc[VMIN] 的設定值,就可以依照不同的需要完成上述的各種傳輸模式。
沒有留言:
張貼留言