天天看點

【linux】系統調用版序列槽分析&源碼實戰

目錄

前言

參考

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 接口推薦先看本文推薦連結,不懂再看本文

清空接收緩沖區,擷取序列槽參數,配置,更新配置

序列槽收發測試就是對該序列槽進行讀寫

程式正常結束,不要忘記關閉裝置檔案

繼續閱讀