日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > linux >内容正文

linux

Linux 串口编程二 深入了解 termios

發(fā)布時(shí)間:2023/12/9 linux 41 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Linux 串口编程二 深入了解 termios 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

前言

這一系列串口編程重點(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)軟件流控。
如果 BRKINT 和 IGNBRK 標(biāo)志都未被設(shè)置,則輸入行中的終止?fàn)顟B(tài)就被讀取為 NULL 字符。

輸出模式

輸出模式控制輸出字符的處理方式,即由程序發(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è)置 OPOST,其他標(biāo)志都被忽略,輸出模式使用頻率較小。

控制模式


控制模式控制終端的硬件特性。通過設(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è)置了 HUPCL,當(dāng)終端驅(qū)動(dòng)程序檢測到與終端對應(yīng)的最后一個(gè)文件描述符被關(guān)閉時(shí),它將通過設(shè)置調(diào)制解調(diào)器控制線來掛斷線路??刂颇J街饕糜诖芯€連接的物理模型中,是在串口編程中十分重要的標(biāo)志。

本地模式


本地模式控制終端的各種特性。通過設(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è)信號。
這里最重要的標(biāo)志是 ECHO 和 ICANON。如果設(shè)置了 ICANON 標(biāo)志,就啟用標(biāo)準(zhǔn)輸入行處理模式,否則,就啟動(dòng)非標(biāo)準(zhǔn)模式。

特殊控制字符

特殊控制字符是一些字符組合,如 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 字符。
非標(biāo)準(zhǔn)模式可以使用的數(shù)組下標(biāo):
  • VINTR:INTR 字符。
  • VMIN:MIN 值。
  • VQUIT:QUIT 字符。
  • VSUSP:SUSP 字符。
  • VTIME:TIME 值。
  • VSTART:START 字符。
  • VSTOP:STOP 字符。
字符的詳細(xì)解釋如下標(biāo)所示:
字符說明INTRQUITERASEKILLEOFEOLSUSPSTOPSTART
該字符使終端驅(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?串口編程的其他文章,可以移步至以下鏈接:

  • 《Linux 串口編程<一> 一些背景》
  • 《Linux 串口編程<二> 深入了解 termios》
  • 《Linux 串口編程<三> 使用termios與API 進(jìn)行串口程序開發(fā)》
  • 《Linux 串口編程<四> 串口設(shè)備程序開發(fā)》

  • 如果有其他想法或者疑問可以給我郵件或者評論~:-D



    總結(jié)

    以上是生活随笔為你收集整理的Linux 串口编程二 深入了解 termios的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。