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:輸入模式標誌,控制終端輸入方式,具體參數如下所示。
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、CR1、CR2和 CR3
TABDLY 水平定位字元輸出延遲,取值範圍為:TAB0、TAB1、TAB2和TAB3
BSDLY 空格輸出延遲,可以取BS0或BS1
VTDLY 垂直定位字元輸出延遲,可以取VT0或VT1
FFDLY 換頁延遲,可以取FF0或FF1
c_cflag:控制模式標誌,指定終端硬體控制資訊,具體參數如下所示。
c_oflag參數
索引值說明
CBAUD 傳輸速率(4+1位)(非POSIX)
CBAUDEX 附加傳輸速率(1位)(非POSIX)
CSIZE 字元長度,取值範圍為CS5、CS6、CS7或CS8
CSTOPB 設定兩個停止位
CREAD 使用接收器
PARENB 使用同位
PARODD 對輸入使用同位,對輸出使用偶校正
HUPCL 關閉裝置時掛起
CLOCAL 忽略數據機線路狀態
CRTSCTS 使用RTS/CTS流量控制
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() 什麼都不做。
(四)tcdrain()
等待直到所有寫入 fd 引用的對象的輸出都被傳輸。
(五)tcflush()
丟棄要寫入 引用的對象,但是尚未傳輸的資料,或者收到但是尚未讀取的資料,取決於 queue_selector 的值:
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() 來檢測是否所有修改都成功實現