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