Linux 串口termios.h分析

1、背景

該到轉嵌入式LInux應用開發的時候了。現在學習,不晚吧。努力。

1.1 參考資料

http://emb.hqyj.com/Column/Column811.htm

http://www.hqyj.com/news/emb174.htm

http://blog.chinaunix.net/uid-11582448-id-745506.html

https://blog.csdn.net/TAlice/article/details/80077064

2、termios.h 的分析

2.0 termios 結構體

     termios是Posix規範中定義的標準接口,表示終端設備(包括虛擬終端、串口等)。由於串口是一種終端設備,因此通過終端編程接口對其進行配置和控制。    

#define NCCS		18
struct termios
{
    unsigned short c_iflag;  // 輸入模式標誌
    unsigned short c_oflag;  // 輸出模式標誌
    unsigned short c_cflag;  // 控制模式標誌
    unsigned short c_lflag;  // 本地模式標誌
    unsigned char c_line;    // 線路規程
    unsigned char c_cc[NCC]; // 控制特性
    speed_t c_ispeed;        // 輸入速度
    speed_t c_ospeed;        // 輸出速度
}

 在結構體termios中c_cflag最爲重要,可設置波特率、數據位、校驗位、停止位。對於c_cflag成員不能直接對其初始化,而要將其通過 & 和 | 操作使用其中的某些選項。 

/* cflag bits */

/* Baud rate values.  These must fit in speed_t, which is unsigned
   char.  See also the extended baud rates below.  These baud rates
   set an additional bit. */
#define CBAUD	 0x0100f     //波特率的位掩碼
#define B0	 0x00000         //0波特率(放棄DTR)
#define B50	 0x00001
#define B75	 0x00002
#define B110	 0x00003
#define B134	 0x00004
#define B150	 0x00005
#define B200	 0x00006
#define B300	 0x00007
#define B600	 0x00008
#define B1200	 0x00009
#define B1800	 0x0000a
#define B2400	 0x0000b
#define B4800	 0x0000c
#define B9600	 0x0000d
#define B19200	 0x0000e
#define B38400	 0x0000f

#define CSIZE	 0x00030      //數據位的位掩碼
#define CS5	 0x00000          //5個數據位
#define CS6	 0x00010          //6個數據位
#define CS7	 0x00020          //7個數據位
#define CS8	 0x00030          //8個數據位
#define CSTOPB	 0x00040     //默認兩位停止位,否則爲1位
#define CREAD	 0x00080     //接收使能
#define PARENB	 0x00100     //校驗位使能
#define PARODD	 0x00200     //使用奇校驗而不使用偶校驗
#define HUPCL	 0x00400     //關閉時掛線(放棄DTR)
#define CLOCAL	 0x00800     //本地鏈接(不改變端口所有者)

/* Extended baud rates above 37K. */
#define CBAUDEX	 0x0100f
#define B57600	 0x01001
#define B115200	 0x01002
#define B128000	 0x01003
#define B230400  0x01004
#define B256000	 0x01005
#define B460800  0x01006
#define B500000  0x01007
#define B576000  0x01008
#define B921600  0x01009
#define B1000000 0x0100a
#define B1152000 0x0100b
#define B1500000 0x0100c
#define B2000000 0x0100d
#define B2500000 0x0100e
#define B3000000 0x0100f

#define CRTSXOFF 0x04000
#define CRTSCTS	 0x08000     //使能硬件流控

成員c_iflag控制端口接收端的字符輸入處理(Read)

/* iflag bits */
#define IGNBRK	0x00001   //忽略中斷情況
#define BRKINT	0x00002   //當發生中斷時發送SIGINT信號
#define IGNPAR	0x00004   //忽略奇偶校驗
#define IMAXBEL	0x00008   //當輸入太長時回覆ECHO(振鈴)
#define INPCK	0x00010   //打開輸入奇偶校驗
#define ISTRIP	0x00020   //剝除輸入字符的第8位
#define INLCR	0x00040   //將輸入的NL轉換爲CR
#define IGNCR	0x00080   //忽略CR
#define ICRNL	0x00100   //將輸入額CR映射到NL
#define IXON	0x00400   //使啓動/停止輸出控制流起作用  啓動輸出軟件流控
#define IXOFF	0x01000   //使啓動/停止輸入控制流起作用  啓動輸入軟件流控
#define IUCLC	0x04000   //將輸入的大寫字符轉換爲小寫字符
#define IXANY	0x08000   //允許字符重新啓動輸出
#define PARMRK	0x10000   //標記奇偶校驗錯誤

成員c_lflag 用於控制終端的本地數據處理和工作模式。通過c_lflag成員控制終端的某些特性。

/* lflag bits */
#define ISIG	0x0001   //若收到信號字符(INTR、QUIT等),則會產生相應的信號
#define ICANON	0x0002   //終端規範模式,默認爲規範模式,否則爲非規範模式
#define ECHO	0x0004   //啓動輸入字符的本地本地回顯功能
#define ECHOE	0x0008   //若設置ICANNO,則允許退格操作
#define ECHOK	0x0010   //若設置ICANNO,則KILL字符會刪除當前行
#define ECHONL	0x0020   //若設置ICANNO, 則允許回顯換行符
#define NOFLSH	0x0040   //在通常情況下,當接受到INTR、QUIT和SUSP控制字符時,會清空輸入和輸出隊列。如果設置該標誌,則所有的隊列不會被清空
#define TOSTOP	0x0080   //若一個後臺進程試圖向它的控制終端進行寫操作,則系統向該後臺進程的進程組發送SIGTTOU信號,該信號通常終止進程的執行
#define IEXTEN	0x0100   //啓用輸入處理功能
#define FLUSHO	0x0200
#define ECHOKE	0x0400
#define ECHOCTL	0x0800   //若設置ECHO,則控制字符(製表符、換行符)會顯示成"^X",其中X的ASCII碼等於給相應控制字符的ASCII碼加上0x40.例如退格符(0x08)會顯示爲"^H"('H'的ASCII碼爲0x48)

 2.1 終端

終端是指用戶與計算機交互的接口,如鍵盤、顯示屏和串口設備等物理設備,還有X Window上的虛擬終端。

2.1.1虛擬終端:

Windows下由putty  SecureCRT等虛擬終端;

類UNIX操作系統有行term、rxvt、zterm、eterm等。 文本式虛擬終端    X Window 上的圖形式虛擬終端。

2.1.2 終端工作模式

終端有三種工作模式:規範模式(canonical mode )、非規範模式(non-canonical mode)和原始模式(raw mode).可通過termios.c_lflag的ICANNON位來配置。選擇規範模式則設置ICANNON位,非規範模式則清除ICANNON位。

<1>規範模式----面向行

在規範模式下,輸入數據基於行進行處理。

 >在用戶輸入一個行結束符(回車符、EOF等)之前,系統調用read()讀不到用戶輸入的任何字符。

>除了EOF之外的行結束符(如回車符等),與普通字符一樣會被read()讀到緩衝區中。

>在規範模式中,可以進行行編輯,而且一次調用read()最多隻能讀取到一行數據

>如果read()請求讀取的數據字節少於當前行可讀取的字節時,則read()只讀取被請求的字節數,剩餘的下次再讀。

輸入字符會被放入一個緩衝中,這樣可以以與用戶交互的方式編輯緩衝區的內容,知道收到CR(carriage return,回車)或者LF(Line feed,換行)字符。

規範模式下,設置ICANNO、ECHO和ECHOE選項。

|= (ICANNO | ECHO | ECHOE);

<2> 非規範模式

在非規範模式下,所有的輸入即時生效,用戶不需要另外輸入行結束符,不能進行行編輯。read()有四種中作模式。

可通過termios.c_cc[MIN] 和termios.c_cc[TIMEOUT]來設置工作模式。這裏TIMEOUT的單位爲1/10秒。

MIN TIMEOUT 工作模式
=0 =0 read()立即返回。若有數據可讀,則讀取並返回讀取的字節數,否則返回0。
>0 =0 read()被阻塞,直到MIN個字節數據可被讀取。
=0 >0 若數據可讀,或超過TIMEOUT無數據,則read()返回。
>0 >0 若MIN個字節可讀,或超過TIMEOUT無數據,則read()返回。

設置非規範模式,需要請掉ICANNO、ECHO、ECHOE和ISIG選項。

&= ~(ICANNO | ECHO | ECHOE | ISIG);

 

<3>原始模式

原始模式是一種特殊的非規範模式。在這種模式下,所有輸入數據以字節爲單位處理。原始輸入根本不會被處理,輸入字符只是被原封不動的接收。

 

 

3、串口初始化、設置和讀寫代碼

 

 

4、

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章