程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> Linux下的串口編程:struct termios結構體

Linux下的串口編程:struct termios結構體

編輯:關於C語言

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

本文出自 “驿落黃昏” 博客,請務必保留此出處http://yiluohuanghun.blog.51cto.com/3407300/1182210

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved