目錄
前言
參考
1. 實戰分析
1.1 開發步驟
1.1.1 擷取序列槽裝置路徑
1.1.2 打開裝置檔案
1.1.3 配置序列槽
termios 結構體
1. c_iflag 輸入模式标志
2. c_oflag 輸出模式标志
3. c_cflag 控制模式标志
4. c_lflag 本地模式标志
5. c_cc[NCCS] 控制字元
6. c_ispeed和c_ospeed 波特率
分析
1.1.4 序列槽收發測試
1.1.5 關閉裝置檔案
附件最終序列槽測試源碼
目前不涉及驅動源碼
linux手冊之termios
李柱明部落格:https://www.cnblogs.com/lizhuming/
本文連結:https://www.cnblogs.com/lizhuming/p/14049897.html
擷取序列槽裝置路徑
打開裝置檔案
配置序列槽
對該裝置檔案進行讀寫,相當于對該序列槽裝置進行讀寫,即通信
關閉裝置檔案
以下代碼段預設從 附件-最終序列槽測試源碼 中摘取
使用數組或者宏定義在相關檔案前面定義預設序列槽路徑,友善修改,源碼段如下:
序列槽路徑優先從傳入參數中擷取,如果參數中沒有傳入,便使用 <code>def_uart_path</code> 預設路徑
擷取裝置句柄,如果擷取失敗,便結束
定義一個結構體 termios 用于擷取、設定終端裝置的參數
包括波特率、資料位數、校驗位等
成員值作用,推薦先看官方手冊,看不懂再看本筆記中文表格
termios 結構體定義在編譯連結工具的頭檔案預設路徑中的bits檔案夾中
如如下源碼來自 /usr/arm-linux-gnueabihf/include/bits/termios.h
成員
說明
c_iflag
輸入模式标志
c_oflag
輸出模式标志
c_cflag
控制模式标志
c_lflag
本地模式标志
c_line
行控制
c_cc[NCCS]
控制字元
c_ispeed
輸入波特率
c_ospeed
輸出波特率
用于控制如何對序列槽輸入的字元進行處理
選項值
IGNBRK
忽略輸入中的 BREAK 狀态。 (忽略指令行中的中斷)
BRKINT
(指令行出 現中斷時,可産生一插斷)如果設定了IGNBRK,中斷條件被忽略。如果沒有設定IGNBRK而設定了BRKINT,中斷條件清空輸入輸出隊列中所有的資料并且向tty的前 台程序組中所有程序發送一個SIGINT信号。如果這兩個都沒有設定,中斷條件會被看作一個0字元。這時,如果設定了PARMRK,當檢測到一個幀誤差時 将會向應用程式發送三個位元組'/377''/0''/0',而不是隻發送一個'/0'
IGNPAR
忽略桢錯誤和奇偶校驗錯
PARMRK
如果設定了IGNPAR,則忽略接收到的資料的奇偶檢驗錯誤或幀錯誤(除了前面提到的中斷條件)。如果沒有設定IGNPAR而設定了PARMRK, 當接收到的位元組存在奇偶檢驗錯誤或幀錯誤的時候。将向應用程式發送一個三位元組的'/377''/0''/n'錯誤報告。其中n表示所接收到的位元組。如果兩 者都沒有設定,除了接收到的位元組存在奇偶檢驗錯誤或幀誤差之外的中止條件都會向應用程式發送一個單位元組('/0')的報告
INPCK
如果設定,則進行奇偶校驗。如果不進行奇偶檢驗,PARMRK和IGNPAR将對存在的奇偶校驗錯誤不産生任何的影響
ISTRIP
如果設定,所接收到的所有位元組的高位将會被去除,保證它們是一個7位的字元
INLCR
如果設定,所接收到的換行字元('/n')将會被轉換成回車符('/r')
IGNCR
如果設定,則會忽略所有接收的回車符('/r')
ICRNL
如果設定,但IGNCR沒有設定,接收到的回車符向應用程式發送時會變換成換行符
IUCLC
如果IUCLC和IEXTEN都設定,接收到的所有大寫字母發送給應程式時都被轉換成小寫字母。POSIX中沒有定義該标記
IXON
如果設定,接收到S後會停止向這個tty裝置輸出,接收到Q後會恢複輸出
IXANY
如果設定,則接到任何字元都會重新開始輸出,而不僅僅是^Q字元
IXOFF
如果設定,為避免tty裝置的輸入緩沖區溢出,tty裝置可以向終端發送停止符S和開始符Q,要求終端停止或重新開始向計算機發送資料。通過停 止符和開始符來控制資料流的方式叫軟體流控制,軟體流控制方式較少用,我們主要還是用硬體流控制方式。硬體流控制在c_cflag标志中設定
IMAXBEL
如果設定,當輸入緩沖區空間滿時,再接收到的任何字元就會發出警報符'/a'。POSIX中沒有定義該标記
IUTF8
(不屬于 POSIX)輸入 IUTF8 ,這是允許 character-erase 在 cooked 模式下被正确執行
用于控制序列槽的輸出模式
OPOST
開啟該标記,後面的輸出标記才會生效。否則,不會對輸出資料進行處理
OLCUC
如果設定,大寫字母被轉換成小寫字母輸出
ONLCR
如果設定,在發送換行符('/n')前先發送回車符('/r')
OCRNL
如果設定,回車符會被轉換成換行符。另外,如果設定了ONLRET,則current column會被設為0
ONOCR
如果設定,當current column為0時,回車符不會被發送也不會被處理
ONLRET
如果設定,當一個換行符或回車符被發送的時候,current column會被設定為0
OFILL
發送填充字元作為延時,而不是使用定時來延時
OFDEL
(不屬于 POSIX) 填充字元是 ASCII DEL (0177)。如果不設定,填充字元則是 ASCII NUL
VTDLY
豎直跳格延時掩碼。取值為 VT0 或 VT1
用于控制序列槽的基本參數,如資料位、停止位等,常用配置見下表,特别地,c_cflag結構體成員還包含了波特率的參數
CLOCAL
如果設定,modem的控制線将會被忽略。如果沒有設定,則open()函數會阻塞直到載波檢測線宣告modem處于摘機狀态為止
CREAD
隻有設定了才能接收字元,該标記是一定要設定的
CSIZE
設定傳輸字元的位數。CS5表示每個字元5位,CS6表示每個字元6位,CS7表示每個字元7位,CS8表示每個字元8位
CSTOPB
設定停止位的位數,如果設定,則會在每幀後産生兩個停止位,如果沒有設定,則産生一個停止位。一般都是使用一位停止位。需要兩位停止位的裝置已過時 了
HUPCL
如果設定,當裝置最後打開的檔案描述符關閉時,序列槽上的DTR和RTS線會減弱信号,通知Modem挂斷。也就是說,當一個使用者通過Modem拔号 登入系統,然後登出,這時Modem會自動挂斷
PARENB
允許輸出産生奇偶資訊以及輸入的奇偶校驗(啟用同位産生與偵測)
PARODD
輸入和輸出是奇校驗(使用奇同位而非偶同位)
CRTSCTS
使用硬體流控制。在高速(19200bps或更高)傳輸時,使用軟體流控制會使效率降低,這個時候必須使用硬體流控制
主要用于控制驅動程式與使用者的互動,在序列槽通信中,實際上用不到該成員變量
ISIG
當接受到字元 INTR, QUIT, SUSP, 或 DSUSP 時,産生相應的信号
ICANON
啟用标準模式 (canonical mode)。允許使用特殊字元EOF, EOL, EOL2, ERASE, KILL, LNEXT, REPRINT, STATUS, 和WERASE,以及按行的緩沖
ECHO
它可以讓你阻止鍵入字元的回應
ECHOE
如果同時設定了 ICANON,字元 ERASE 擦除前一個輸入字元,WERASE 擦除前一個詞
ECHOK
如果同時設定了 ICANON,字元 KILL 删除目前行
ECHONL
如果同時設定了 ICANON,回顯字元 NL,即使沒有設定 ECHO
NOFLSH
禁止在産生 SIGINT, SIGQUIT 和 SIGSUSP 信号時重新整理輸入和輸出隊列,即關閉queue中的flush
TOSTOP
向試圖寫控制終端的背景程序組發送 SIGTTOU 信号(傳送欲寫入的資訊到背景 處理)
IEXTEN
啟用實作自定義的輸入處理。這個标志必須與 ICANON同時使用,才能解釋特殊字元 EOL2,LNEXT,REPRINT 和WERASE,IUCLC 标志才有效
該數組包含了終端的所有特殊字元,可以修改特殊字元對應的鍵值(Ctrl+C産生的^C,ASCII碼為0x03)
僅列出常用的
VINTR
中斷字元。發出 SIGINT 信号。當設定了c_lflag的ISIG标志位時,該字母不再作為輸入傳遞
VERASE
删除字元。删除上一個還沒有删掉的字元,但不删除上一個EOF 或行首。當設定 ICANON 時可被識别,不再作為輸入傳遞
VIM
設定非标準模式讀取的最小位元組數
VTIM
設定非标準模式讀取時的延時值,機關為十分之一秒
注意以 0 開頭的數字在是 C語言 的 8進制 數字形式
以上隻是介紹了 termios 結構體,在編寫代碼時,我們使用相關 api 去配置該結構體進而配置序列槽
api 接口推薦先看本文推薦連結,不懂再看本文
清空接收緩沖區,擷取序列槽參數,配置,更新配置
序列槽收發測試就是對該序列槽進行讀寫
程式正常結束,不要忘記關閉裝置檔案