termios 結構體各成員 詳解及設置

ermios結構體內容:
成員 描述
-------------------------------------------
c_cflag 控制模式標誌
c_lflag 本地模式標誌
c_iflag 輸入模式標誌
c_oflag 輸出模式標誌
c_line line discipline
c_cc[NCCS] 控制字符
c_ispeed 輸入波特率
c_ospeed 輸出波特率
 

在termios結構中的四個標誌控制了輸入輸出的四個不同部份。輸入模式標誌c_iflag決定如何解釋和處理接收的字符。輸出模式標誌 c_oflag決定如何解釋和處理髮送到tty設備的字符。控制模式標誌決定設備的一系列協議特徵,這一標誌只對物理設備有效。本地模式標誌 c_lflag決定字符在輸出前如何收集和處理。

在串口傳輸中,用波特率來表示傳輸的速度,1波特表示在1秒鐘內可以傳輸1個碼元。波特率設置可以使用 cfsetispeed(&new_termios,B19200)和 cfsetospeed(&new_termios,B19200)這兩個函數來完成,默認的波特率爲9600baud。 cfsetispeed()函數用來設置輸入的波特率,cfsetospeed()函數用來設置輸出的波特率。B19200是termios.h頭文件裏 定義的一個宏,表示19200的波特率。

CLOCAL和CREAD是c_cflag成員中與速率相關的標誌,在串口編程中,這兩個標誌一定要有效,以確保程序在突發的作業控制或掛起時,不 會成爲端口的佔有都,同時串口的接收驅動會自動讀入數據。設置方法如下:

termios_new.c_cflag |= CLOCAL; //保證程序不會成爲端的佔有者
termios_new.c_cflag |= CREAD; //使端口能讀取輸入的數據
 

設置串口屬性不能直接賦值,要通過對termios不同成員進行"與"和"或"操作來實現。在termios.h文件,定義了各種常量,如上面介紹 的CLOCAL,CREAD。這些常量的值是掩碼,通過把這些常量與termios結構成員進行邏輯操作就可實現串口屬性的設置。在編程時用"|="來啓 用屬性,用"&=~"來取消屬性。

9.3. c_iflag 輸入標誌說明

  • BRKINT和IGNBRK

    如果設置了IGNBRK,中斷條件被忽略。如果沒有設置IGNBRK而設置了BRKINT,中斷條件清空輸入輸出隊列中所有的數據並且向tty的前 臺進程組中所有進程發送一個SIGINT信號。如果這兩個都沒有設置,中斷條件會被看作一個0字符。這時,如果設置了PARMRK,當檢測到一個幀誤差時 將會嚮應用程序發送三個字節'/377''/0''/0',而不是隻發送一個'/0'。

  • PARMRK和IGNPAR

    如果設定了IGNPAR,則忽略接收到的數據的奇偶檢驗錯誤或幀錯誤(除了前面提到的中斷條件)。如果沒有設置IGNPAR而設置了PARMRK, 當接收到的字節存在奇偶檢驗錯誤或幀錯誤的時候。將嚮應用程序發送一個三字節的'/377''/0''/n'錯誤報告。其中n表示所接收到的字節。如果兩 者都沒有設置,除了接收到的字節存在奇偶檢驗錯誤或幀誤差之外的中止條件都會嚮應用程序發送一個單字節('/0')的報告。

  • INPCK

    如果設置,則進行奇偶校驗。如果不進行奇偶檢驗,PARMRK和IGNPAR將對存在的奇偶校驗錯誤不產生任何的影響。

  • ISTRIP

    如果設置,所接收到的所有字節的高位將會被去除,保證它們是一個7位的字符。

  • INLCR

    如果設置,所接收到的換行字符('/n')將會被轉換成回車符('/r')。

  • IGNCR

    如果設置,則會忽略所有接收的回車符('/r')。

  • ICRNL

    如果設置,但IGNCR沒有設置,接收到的回車符嚮應用程序發送時會變換成換行符。

  • IUCLC

    如果IUCLC和IEXTEN都設置,接收到的所有大寫字母發送給應程序時都被轉換成小寫字母。POSIX中沒有定義該標記。

  • IXOFF

    如果設置,爲避免tty設備的輸入緩衝區溢出,tty設備可以向終端發送停止符^S和開始符^Q,要求終端停止或重新開始向計算機發送數據。通過停 止符和開始符來控制數據流的方式叫軟件流控制,軟件流控制方式較少用,我們主要還是用硬件流控制方式。硬件流控制在c_cflag標誌中設置。

  • IXON

    如果設置,接收到^S後會停止向這個tty設備輸出,接收到^Q後會恢復輸出。

  • IXANY

    如果設置,則接到任何字符都會重新開始輸出,而不僅僅是^Q字符。

  • IMAXBEL

    如果設置,當輸入緩衝區空間滿時,再接收到的任何字符就會發出警報符'/a'。POSIX中沒有定義該標記。

9.4. c_oflag 輸出標誌說明

OPOST是POSIX定義的唯一一個標誌,只有設置了該標誌後,其它非POSIX的輸出標記纔會生效。

  • OPOST

    開啓該標記,後面的輸出標記纔會生效。否則,不會對輸出數據進行處理。

  • OLCUC

    如果設置,大寫字母被轉換成小寫字母輸出。

  • ONLCR

    如果設置,在發送換行符('/n')前先發送回車符('/r')。

  • ONOCR

    如果設置,當current column爲0時,回車符不會被髮送也不會被處理。

  • OCRNL

    如果設置,回車符會被轉換成換行符。另外,如果設置了ONLRET,則current column會被設爲0.

  • ONLRET

    如果設置,當一個換行符或回車符被髮送的時候,current column會被設置爲0。

  • OXTABS

    如果設置,製表符會被轉換成空格符。

9.5. 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

    如果設置PARENB,會產生一個奇偶檢驗位。如果沒有設置PARODD,則產生偶校驗位,如果設置了PARODD,則產生奇校驗位。如果沒有設置 PARENB,則PARODD的設置會被忽略。

  • CRTSCTS

    使用硬件流控制。在高速(19200bps或更高)傳輸時,使用軟件流控制會使效率降低,這個時候必須使用硬件流控制。

9.6. c_cc[] 控制字符說明

只有在本地模式標誌c_lflag中設置了IEXITEN時,POSIX沒有定義的控制字符才能在Linux中使用。每個控制字符都對應一個按鍵組 合(^C、^H等),但VMIN和VTIME這兩個控制字符除外,它們不對應控制符。這兩個控制字符只在原始模式下才有效。

  • c_cc[VINTR]

    默認對應的控制符是^C,作用是清空輸入和輸出隊列的數據並且向tty設備的前臺進程組中的每一個程序發送一個SIGINT信號,對SIGINT信 號沒有定義處理程序的進程會馬上退出。

  • c_cc[VQUIT]

    默認對應的控制符是^/,作用是清空輸入和輸出隊列的數據並向tty設備的前臺進程組中的每一個程序發送一個SIGQUIT信號,對SIGQUIT 信號沒有定義處理程序的進程會馬上退出。

  • c_cc[verase]

    默認對應的控制符是^H或^?,作用是在標準模式下,刪除本行前一個字符,該字符在原始模式下沒有作用。

  • c_cc[VKILL]

    默認對應的控制符是^U,在標準模式下,刪除整行字符,該字符在原始模式下沒有作用。

  • c_cc[VEOF]

    默認對應的控制符是^D,在標準模式下,使用read()返回0,標誌一個文件結束。

  • c_cc[VSTOP]

    默認對應的控制字符是^S,作用是使用tty設備暫停輸出直到接收到VSTART控制字符。或者,如果設備了IXANY,則等收到任何字符就開始輸 出。

  • c_cc[VSTART]

    默認對應的控制字符是^Q,作用是重新開始被暫停的tty設備的輸出。

  • c_cc[VSUSP]

    默認對應的控制字符是^Z,使當前的前臺進程接收到一個SIGTSTP信號。

  • c_cc[VEOL]和c_cc[VEOL2]

    在標準模式下,這兩個下標在行的末尾加上一個換行符('/n'),標誌一個行的結束,從而使用緩衝區中的數據被髮送,並開始新的一行。POSIX中 沒有定義VEOL2。

  • c_cc[VREPRINT]

    默認對應的控制符是^R,在標準模式下,如果設置了本地模式標誌ECHO,使用VERPRINT對應的控制符和換行符在本地顯示,並且重新打印當前 緩衝區中的字符。POSIX中沒有定義VERPRINT。

  • c_cc[VWERASE]

    默認對應的控制字符是^W,在標準模式下,刪除緩衝區末端的所有空格符,然後刪除與之相鄰的非空格符,從而起到在一行中刪除前一個單詞的效果。 POSIX中沒有定義VWERASE。

  • c_cc[VLNEXT]

    默認對應的控制符是^V,作用是讓下一個字符原封不動地進入緩衝區。如果要讓^V字符進入緩衝區,需要按兩下^V。POSIX中沒有定義 VLNEXT。

要禁用某個控制字符,只需把它設置爲_POSIX_VDISABLE即可。但該常量只在Linux中有效,所以如果程序要考慮移植性的問題,請不要 使用該常量。

9.7. c_lflag 本地模式標誌說明

  • ICANON

    如果設置,則啓動標準模式,如果沒有設置,則啓動原始模式。

  • ECHO

    如果設置,則啓動本地回顯。如果沒有設置,則除了ECHONL之外,其他以ECHO開頭的標記都會失效。

  • ECHOCTL

    如果設置,則以^C的形式打印控制字符,如:按Ctrl+C顯示^C,按Ctrl+?顯示^?。

  • ECHOE

    如果在標準模式下設定了ECHOE標誌,則當收到一個ERASE控制符時將刪除前一個顯示字符。

  • ECHOK和ECHOKE

    在標準模式下,當接收到一個KILL控制符,則在緩衝區中刪除當前行。如果ECHOK、ECHOKE和ECHOE都沒有設置,則用ECHOCTL表 示的KILL字符(^U)將會在輸出終端上顯示,表示當前行已經被刪除。

    如果已經設置了ECHOE和ECHOK,但沒有設置ECHOKE,將會在輸出終端顯示ECHOCTL表示的KILL字符,緊接着是換行,如果設置了 OPOST,將會通過OPOST處理程序進行適當的處理。

    如果ECHOK、ECHOKE和ECHOE都有設置,則會刪除當前行。

    在POSIX中沒有定義ECHOKE標記,在沒有定義ECHOKE標記的系統中,設置ECHOK則表示同時設置了ECHOKE標誌。

  • ECHONL

    如果在標準模式下設置了該標誌,即使沒有設置ECHO標誌,換行符還是會被顯示出來。

  • ECHOPRT

    如果設置,則字符會被簡單地打印出來,包括各種控制字符。在POSIX中沒有定義該標誌。

  • ISIG

    如果設置,與INTR、QUIT和SUSP相對應的信號SIGINT、SIGQUIT和SIGTSTP會發送到tty設備的前臺進程組中的所有進 程。

  • NOFLSH

    一般情況下,當接收到INTR或QUIT控制符的時候會清空輸入輸出隊列,當接收到SUSP控制符時會清空輸入隊列。但是如果設置了NOFLUSH 標誌,則所有隊列都不會被清空。

  • TOSTOP

    如果設置,則當一個非前臺進程組的進程試圖向它的控制終端寫入數據時,信號SIGTTOU會被被髮送到這個進程所在的進程組。默認情況下,這個信號 會使進程停止,就像收到SUSP控制符一樣。

  • IEXIEN

    默認已設置,我們不應修改它。在Linux中IUCLC和幾個與刪除字符相關的標記都要求在設置了IEXIEN才能正常工作。

9.8. 下面介紹 一些常用串口屬性的設置方法。

  • 設置流控制

    termios_new.c_cflag &= ~CRTSCTS; //不使用流控制
    termios_new.c_cflag |= CRTSCTS; //使用硬件流控制
    termios_new.c_iflag |= IXON|IXOFF|IXANY; //使用軟件流控制
     
  • 屏蔽字符大小位

    termios_new.c_cflag &= ~CSIZE; 
     
  • 設置數據位大小

    termios_new.c_cflag |= CS8; //使用8位數據位
    termios_new.c_cflag |= CS7; //使用7位數據位
    termios_new.c_cflag |= CS6; //使用6位數據位
    termios_new.c_cflag |= CS5; //使用5位數據位
     
  • 設置奇偶校驗方式

    termios_new.c_cflag &= ~PARENB; //無奇偶校驗
     
    termios_new.c_cflag |= PARENB; //奇校驗
    termios_new.c_cflag &= ~PARODD; 
     
    termios_new.c_cflag |= PARENB; //偶校驗
    termios_new.c_cflag &= ~PARODD; 
     
  • 停止位

    termios_new.c_cflag |= CSTOPB; //2位停止位
    termios_new.c_cflag &= ~CSTOPB; //1位停止位 
     
  • 輸出模式

    termios_new.c_cflag &= ~OPOST; //原始數據(RAW)輸出
     
  • 控制字符

    termios_new.c_cc[VMIN] = 1; //讀取字符的最小數量
    termios_new.c_cc[VTIME] = 1; //讀取第一個字符的等待時間
     
  • 關閉終端回顯,鍵盤輸入的字符不會在終端窗口顯示。

    #include <stdio.h>
    #include <stdlib.h>
    #include <termios.h>
    #include <unistd.h>
     
    int main(void)
    {
    struct termios ts,ots;
    char passbuf[1024];
     
    tcgetattr(STDIN_FILENO,&ts); /* STDIN_FILENO的值是1,表示標準輸入的文件描述符 */
    ots = ts;
     
    ts.c_lflag &= ~ECHO; /* 關閉回終端回顯功能*/
    ts.c_lflag |= ECHONL;
    tcsetattr(STDIN_FILENO,TCSAFLUSH,&ts); /* 應用新終端設置 */
     
    fgets(passbuf,1024,stdin); /* 輸入字符不會在終端顯示 */
    printf("you input character = %s/n",passbuf);
     
    tcsetattr(STDIN_FILENO,TCSANOW,&ots); /* 恢復舊的終端設備 */
    }
上一篇:secureCRT The remote system refused the con
發佈了53 篇原創文章 · 獲贊 17 · 訪問量 48萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章