Linux 串口编程二 深入了解 termios
前言
這一系列串口編程重點(diǎn)在應(yīng)用層編程,但是在講解原理與相關(guān)概念時(shí)需要對驅(qū)動(dòng)框架有個(gè)基礎(chǔ)的認(rèn)識(shí)。如果只是淺嘗輒止,以后在遇到串口驅(qū)動(dòng)與應(yīng)用層程序調(diào)試難免遇到瓶頸。關(guān)于 tty驅(qū)動(dòng)架構(gòu)參見我的其他博客:Linux tty驅(qū)動(dòng)程序架構(gòu)。有時(shí)了解下底層以及實(shí)現(xiàn)方式對于應(yīng)用層編程的幫助也是大有裨益的。之前博客講了終端,tty,控制臺(tái)等概念以及區(qū)別,因此在串口編程相關(guān)章節(jié)中提及串口,有時(shí)也會(huì)用終端,tty等來替代,注意它們實(shí)際上所指是相同的。
在 Linux 中可以通過一組函數(shù)調(diào)用(通用終端接口,簡稱GTI)來控制終端,這組函數(shù)調(diào)用與用于讀寫數(shù)據(jù)的函數(shù)是分離的,這就使得讀寫數(shù)據(jù)的接口非常簡潔,同時(shí)又允許可以對終端或串口的行為進(jìn)行更精細(xì)地控制。但由于需要支持大量不同類型的硬件,GTI 中實(shí)現(xiàn)的 IO 接口卻不簡潔。
詳解 termios
termios 是在 POSIX 規(guī)范中定義的標(biāo)準(zhǔn)接口,它類似與 System V 中的 termio 接口。通過設(shè)置 termios 類型的數(shù)據(jù)結(jié)構(gòu)中的值和使用一小組函數(shù)調(diào)用,就可以對終端接口進(jìn)行控制。termios 的結(jié)構(gòu)體定義以及相關(guān)函數(shù)調(diào)用參見 termios.h 頭文件。termios 結(jié)構(gòu)的定義如下:
如定義所示,影響終端的參數(shù)按照不同模式分成如下幾類:
- 輸入模式
- 輸出模式
- 控制模式
- 本地模式
- 線路規(guī)程
- 特殊控制字符
- 輸入速率
- 輸出速率
輸入模式
輸入模式控制輸入數(shù)據(jù)(終端驅(qū)動(dòng)程序從串行口或鍵盤接收到的字符)在被傳遞給程序之前的處理方式。通過設(shè)置 termios 結(jié)構(gòu)中 c_iflag 成員的標(biāo)志對它們進(jìn)行控制。所有的標(biāo)志都被定義為宏,這也是所有終端模式都采用的方法??捎糜?c_iflag 成員的宏如下所示:
- BRKINT:當(dāng)在輸入行中檢測到一個(gè)終止?fàn)顟B(tài)(連接丟失)時(shí),產(chǎn)生一個(gè)中斷。
- IGNBRK:忽略輸入行中的終止?fàn)顟B(tài)。
- ICRNL:將接收到的回車符轉(zhuǎn)換為新行符。
- IGNCR:忽略接收到的回車符。
- INLCR:將接收到的新行符轉(zhuǎn)換為回車符。
- IGNPAR:忽略奇偶校驗(yàn)錯(cuò)誤的字符。
- INPCK:對接收到的字符執(zhí)行奇偶校驗(yàn)。
- PARMRK:對奇偶校驗(yàn)錯(cuò)誤做出標(biāo)記。
- ISTRIP:將所有接收到的字符裁剪為 7 比特位。
- IXOFF:對輸入啟動(dòng)軟件流控。
- IXON:對輸出啟動(dòng)軟件流控。
輸出模式
輸出模式控制輸出字符的處理方式,即由程序發(fā)送出去的字符在傳遞到串行口或屏幕之前是如何處理的。可用于 c_oflag 成員的宏如下所示:
- OPOST:打開輸出處理功能。
- ONLCR:將輸出中的換行符轉(zhuǎn)換為回車/換行符。
- OCRNL:將輸出中的回車符轉(zhuǎn)換為新行符。
- ONOCR:在第0列不輸出回車符。
- ONLRET:不輸出回車符。
- OFILL:發(fā)送填充字符以提供延時(shí)。
- OFDEL:用DEL而不是NULL字符作為填充字符。
- NLDLY:新行符延時(shí)選擇。
- CRDLY:回車符延時(shí)選擇。
- TABDLY:制表符延時(shí)選擇。
- BSDLY:退格符延時(shí)選擇。
- VTDLY:垂直制表符延時(shí)選擇。
- FFDLY:換頁符延時(shí)選擇。
控制模式
控制模式控制終端的硬件特性。通過設(shè)置 termios 結(jié)構(gòu)中 c_cflag 標(biāo)志對控制模式進(jìn)行配置。可用于 c_cflag 成員宏如下所示:
- CLOCAL:忽略所有調(diào)制解調(diào)器的狀態(tài)行。
- CREAD:啟動(dòng)字符接收器。
- CS5:發(fā)收采用5位數(shù)據(jù)位。
- CS6:發(fā)收采用6位數(shù)據(jù)位。
- CS7:發(fā)收采用7位數(shù)據(jù)位。
- CS8:發(fā)收采用8位數(shù)據(jù)位。
- CSTOPB:字符采用兩位停止位。
- HUPCL:關(guān)閉時(shí)掛斷調(diào)制解調(diào)器。
- PARENB:使能奇偶校驗(yàn)。
- PARODD:使用奇校驗(yàn)。
本地模式
本地模式控制終端的各種特性。通過設(shè)置 termios 結(jié)構(gòu)中 c_lflag 標(biāo)志對本地模式進(jìn)行配置??捎糜?c_lflag 成員宏如下所示:
- ECHO:啟用輸入字符的本地回顯功能。
- ECHOE:接收到 ERASE 時(shí)執(zhí)行退格、空格、退格的動(dòng)作組合。
- ECHOK:接收到 KILL 字符時(shí)執(zhí)行行刪除操作。
- ECHONL:回顯新行符。
- ICANON:啟用標(biāo)準(zhǔn)輸入處理。
- IEXTEN:啟用基于特定實(shí)現(xiàn)的函數(shù)。
- ISIG:啟用新號。
- NOFLSH:禁止清空隊(duì)列。
- TOSTOP:在試圖進(jìn)行寫操作之前給后臺(tái)進(jìn)程發(fā)送一個(gè)信號。
特殊控制字符
特殊控制字符是一些字符組合,如 Ctrl+C,當(dāng)用戶鍵入這樣的組合鍵,終端會(huì)采取特殊處理方式。termios 中 c_cc 數(shù)組將各種特殊字符映射到對應(yīng)的支持函數(shù)。每個(gè)字符位置(數(shù)組下標(biāo))由對應(yīng)的宏定義的。根據(jù)終端是否被設(shè)置為標(biāo)準(zhǔn)模式(即上節(jié)提到的 ICANON 標(biāo)志),數(shù)組使用也分為標(biāo)準(zhǔn)與非標(biāo)準(zhǔn)兩種情形。
標(biāo)準(zhǔn)模式可以使用的數(shù)組下標(biāo):
- VEOF:EOF 字符。
- VEOL:EOL 字符。
- VERASE:ERASE 字符。
- VINTR:INTR 字符。
- VKILL:KILL 字符。
- VQUIT:QUIT 字符。
- VSUSP:SUSP 字符。
- VSTART:START 字符。
- VSTOP:STOP 字符。
- VINTR:INTR 字符。
- VMIN:MIN 值。
- VQUIT:QUIT 字符。
- VSUSP:SUSP 字符。
- VTIME:TIME 值。
- VSTART:START 字符。
- VSTOP:STOP 字符。
| 該字符使終端驅(qū)動(dòng)程序向與終端相連的進(jìn)程發(fā)送 SIGINT 信號 |
| 該字符使終端驅(qū)動(dòng)程序向與終端相連的進(jìn)程發(fā)送 SIGQUIT 信號 |
| 該字符使終端驅(qū)動(dòng)程序刪除輸入行中的最后一個(gè)字符 |
| 該字符使終端驅(qū)動(dòng)程序刪除整個(gè)輸入行 |
| 該字符使終端驅(qū)動(dòng)程序?qū)⑤斎胄兄械娜孔址麄鬟f給正在讀取輸入的應(yīng)用程序。若輸入行為空,read為0 |
| 作用類似于行結(jié)束符,效果和常用的新行符相同 |
| 該字符使終端驅(qū)動(dòng)程序向與終端相連的進(jìn)程發(fā)送SIGSUSP信號,用于掛起當(dāng)前應(yīng)用程序 |
| 字符作用“截流”,即阻止向終端的進(jìn)一步輸出。用于支持 XON/XOFF 流控,通常被設(shè)置為 ASCII 的XOFF |
| 重新啟動(dòng)被 STOP 暫停的輸出,通過被設(shè)置為 ASCII 的 XON 字符。 |
VTIME 和 VMIN
TIME值和MIN值只能用于非標(biāo)準(zhǔn)模式,關(guān)于二者的使用詳見博客:Linux termios 串口編程之 VTIME與VMIN。
SHELL下使用 stty 訪問終端模式
在 shell 下可以使用 stty 可以訪問終端 termios。如:
#打印串口設(shè)備 ttyUSB0 設(shè)置情況。 root@ubuntu:/# stty -F /dev/ttyUSB0 -a #設(shè)置 ttyUSB0 為 115200 波特率,8位數(shù)據(jù)位。 root@ubuntu:/# stty -F /dev/ttyUSB0 ispeed 115200 ospeed 115200 cs8
在設(shè)置成功之后就可以通過 cat、echo 等 shell 命令對設(shè)備進(jìn)行讀寫了。
本篇重點(diǎn)在于介紹 termios 概念以及詳細(xì)模式標(biāo)志位等,大部分是不需要記憶的,使用頻率也很低。
關(guān)于?Linux?串口編程的其他文章,可以移步至以下鏈接:
如果有其他想法或者疑問可以給我郵件或者評論~:-D
總結(jié)
以上是生活随笔為你收集整理的Linux 串口编程二 深入了解 termios的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 求解10的75次方问题
- 下一篇: linux中/usr下文件权限修改set