termios結構體以及串列埠應用

2021-07-02 04:48:44 字數 4787 閱讀 7125

arm8一直不知道怎麼學,每天就只是看**看使用者手冊,發現不會的不理解的便在網上查,但總感覺這樣沒有乙個系統的學習方案會走不少的彎路。最近看termios結構體出現的次數很多,便總結了一下。

struct termios

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() 來檢測是否所有修改都成功實現

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 輸入模式標誌,控制終端輸入方式,具體引數如下所示。...

termios結構體各成員

termios結構體內容 成員 描述 c cflag 控制模式標誌 c lflag 本地模式標誌 c iflag 輸入模式標誌 c oflag 輸出模式標誌 c line line discipline c cc nccs 控制字元 c ispeed 輸入波特率 c ospeed 輸出波特率 在te...

termios結構體之tcsetattr函式

tcsetattr是用於設定終端引數的函式 int tcsetattr int fd,int optional actions,const struct termios termios p tcsetattr函式用於設定終端引數。函式在成功的時候返回0,失敗的時候返回 1,並設定errno的值。引數...