Linux串口通訊之termios結構體說明

termios結構體中,該結構體通常包括以下的成員:
tcflag_t c_iflag;      
tcflag_t c_oflag;      
tcflag_t c_cflag;      
tcflag_t c_lflag;     
cc_t     c_cc[NCCS];
  

 
 其具體意義以下
 
c_iflag:輸入模式標誌,控制終端輸入方式,具體參數以下所示。
ios

c_iflag參數表
鍵值說明
IGNBRK 忽略BREAK鍵輸入
BRKINT 若是設置了IGNBRK,BREAK鍵的輸入將被忽略,若是設置了BRKINT ,將產生SIGINT中斷
IGNPAR 忽略奇偶校驗錯誤
PARMRK 標識奇偶校驗錯誤
INPCK 容許輸入奇偶校驗
ISTRIP 去除字符的第8個比特
INLCR 將輸入的NL(換行)轉換成CR(回車)
IGNCR 忽略輸入的回車
ICRNL 將輸入的回車轉化成換行(若是IGNCR未設置的狀況下)
IUCLC 將輸入的大寫字符轉換成小寫字符(非POSIX)
IXON 容許輸入時對XON/XOFF流進行控制
IXANY 輸入任何字符將重啓中止的輸出
IXOFF 容許輸入時對XON/XOFF流進行控制
IMAXBEL 當輸入隊列滿的時候開始響鈴,Linux在使用該參數而是認爲該參數老是已經設置
異步

 

c_oflag:輸出模式標誌,控制終端輸出方式,具體參數以下所示。
c_oflag參數
鍵值說明
OPOST 處理後輸出
OLCUC 將輸入的小寫字符轉換成大寫字符(非POSIX)
ONLCR 將輸入的NL(換行)轉換成CR(回車)及NL(換行)
OCRNL 將輸入的CR(回車)轉換成NL(換行)
ONOCR 第一行不輸出回車符
ONLRET 不輸出回車符
OFILL 發送填充字符以延遲終端輸出
OFDEL 以ASCII碼的DEL做爲填充字符,若是未設置該參數,填充字符將是NUL(‘/0’)(非POSIX)
NLDLY 換行輸出延時,能夠取NL0(不延遲)或NL1(延遲0.1s)
CRDLY 回車延遲,取值範圍爲:CR0、CR一、CR2和 CR3
TABDLY 水平製表符輸出延遲,取值範圍爲:TAB0、TAB一、TAB2和TAB3
BSDLY 空格輸出延遲,能夠取BS0或BS1
VTDLY 垂直製表符輸出延遲,能夠取VT0或VT1
FFDLY 換頁延遲,能夠取FF0或FF1

函數

c_cflag:控制模式標誌,指定終端硬件控制信息,具體參數以下所示。
c_oflag參數
鍵值說明
CBAUD 波特率(4+1位)(非POSIX)
CBAUDEX 附加波特率(1位)(非POSIX)
CSIZE 字符長度,取值範圍爲CS五、CS六、CS7或CS8
CSTOPB 設置兩個中止位
CREAD 使用接收器
PARENB 使用奇偶校驗
PARODD 對輸入使用奇偶校驗,對輸出使用偶校驗
HUPCL 關閉設備時掛起
CLOCAL 忽略調制解調器線路狀態
CRTSCTS 使用RTS/CTS流控制
spa


c_lflag:本地模式標誌,控制終端編輯功能,具體參數以下所示。
c_lflag參數
鍵值說明
ISIG 當輸入INTR、QUIT、SUSP或DSUSP時,產生相應的信號
ICANON 使用標準輸入模式
XCASE 在ICANON和XCASE同時設置的狀況下,終端只使用大寫。若是隻設置了XCASE,則輸入字符將被轉換爲小寫字符,除非字符使用了轉義字符(非POSIX,且Linux不支持該參數)
ECHO 顯示輸入字符
ECHOE 若是ICANON同時設置,ERASE將刪除輸入的字符,WERASE將刪除輸入的單詞
ECHOK 若是ICANON同時設置,KILL將刪除當前行
ECHONL 若是ICANON同時設置,即便ECHO沒有設置依然顯示換行符
ECHOPRT 若是ECHO和ICANON同時設置,將刪除打印出的字符(非POSIX)
TOSTOP 向後臺輸出發送SIGTTOU信號
對象

 

與此結構體相關的函數
(一)tcgetattr()
1.原型
int tcgetattr(int fd,struct termois & termios_p);
2.
功能 
取得終端介質(fd)初始值,並把其值 賦給temios_p;函數能夠從後臺進程中調用;可是,終端屬性可能被後來的前臺進程所改變。隊列


(二)tcsetattr() 
1.原型
int tcsetattr(int fd,int actions,const struct    termios *termios_p);
2.功能
設置與終端相關的參數 (除非須要底層支持卻沒法知足),使用 termios_p 引用的 termios 結構。optional_actions (tcsetattr函數的第二個參數)指定了何時改變會起做用: 
TCSANOW:改變當即發生  
TCSADRAIN:改變在全部寫入 fd 的輸出都被傳輸後生效。這個函數應當用於修改影響輸出的參數時使用。(當前輸出完成時將值改變)  
TCSAFLUSH :改變在全部寫入 fd 引用的對象的輸出都被傳輸後生效,全部已接受但未讀入的輸入都在改變發生前丟棄(同TCSADRAIN,但會捨棄當前全部值)。 進程


(三)tcsendbreak()
  傳送連續的 0 值比特流,持續一段時間,若是終端使用異步串行數據傳輸的話。若是 duration 是 0,它至少傳輸 0.25 秒,不會超過 0.5 秒。若是 duration 非零,它發送的時間長度由實現定義。 
若是終端並不是使用異步串行數據傳輸,tcsendbreak() 什麼都不作。get


(四)tcdrain() 
等待直到全部寫入 fd 引用的對象的輸出都被傳輸。原型


(五)tcflush() 
丟棄要寫入 引用的對象,可是還沒有傳輸的數據,或者收到可是還沒有讀取的數據,取決於 queue_selector 的值:io

TCIFLUSH :刷新收到的數據可是不讀  
TCOFLUSH :刷新寫入的數據可是不傳送  
TCIOFLUSH :同時刷新收到的數據可是不讀,而且刷新寫入的數據可是不傳送 

 

(六)tcflow() 
掛起 fd 引用的對象上的數據傳輸或接收,取決於 action 的值:

TCOOFF :掛起輸出  
TCOON :從新開始被掛起的輸出  
TCIOFF :發送一個 STOP 字符,中止終端設備向系統傳送數據  
TCION :發送一個 START 字符,使終端設備向系統傳輸數據  
打開一個終端設備時的默認設置是輸入和輸出都沒有掛起。


(七)波特率函數 
被用來獲取和設置 termios 結構中,輸入和輸出波特率的值。新值不會立刻生效,直到成功調用了 tcsetattr() 函數。
設置速度爲 B0 使得 modem "掛機"。與 B38400 相應的實際比特率能夠用 setserial(8) 調整。 
輸入和輸出波特率被保存於 termios 結構中。 
cfmakeraw 設置終端屬性以下: 
            termios_p->c_iflag &= ~(IGNBRK|BRKINT|PARMRK|ISTRIP|INLCR|IGNCR|ICRNL|IXON);
            termios_p->c_oflag &= ~OPOST;
            termios_p->c_lflag &= ~(ECHO|ECHONL|ICANON|ISIG|IEXTEN);
            termios_p->c_cflag &= ~(CSIZE|PARENB);
            termios_p->c_cflag |= CS8;

 

1.cfgetospeed() 返回 termios_p 指向的 termios 結構中存儲的輸出波特率 
2.cfsetospeed() 設置 termios_p 指向的 termios 結構中存儲的輸出波特率爲 speed。取值必須是如下常量之一: 
B0        B50        B75        B110        B134        B150        B200        B300        B600        B1200        B1800        B2400        B4800        B9600        B19200        B38400        B57600        B115200        B230400
其中:零值 B0 用來中斷鏈接。若是指定了 B0,不該當再假定存在鏈接。一般,這樣將斷開鏈接。CBAUDEX 是一個掩碼,指示高於 POSIX.1 定義的速度的那一些 (57600 及以上)。所以,B57600 & CBAUDEX 爲非零。 
3.cfgetispeed() 返回 termios 結構中存儲的輸入波特率。 
4.cfsetispeed() 設置 termios 結構中存儲的輸入波特率爲 speed。若是輸入波特率被設爲0,實際輸入波特率將等於輸出波特率。

 
RETURN VALUE 返回值1.cfgetispeed() 返回 termios 結構中存儲的輸入波特率。 2.cfgetospeed() 返回 termios 結構中存儲的輸出波特率。 3.其餘函數返回:   (1)0:成功   (2)  -1:失敗,    而且爲 errno 置值來指示錯誤。 注意 tcsetattr() 返回成功,若是任何所要求的修改能夠實現的話。所以,當進行多重修改時,應當在這個函數以後再次調用 tcgetattr() 來檢測是否全部修改都成功實現

相關文章
相關標籤/搜索