新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 文件I/O編程之: 嵌入式Linux串口應用編程

        文件I/O編程之: 嵌入式Linux串口應用編程

        作者: 時間:2013-09-13 來源:網絡 收藏

        本文引用地址:http://www.104case.com/article/257136.htm

        c_lflag用于控制控制終端的本地數據處理和工作模式,c_lflag所支持的常量名稱如表6.14所示。

        表6.14 c_lflag支持的常量名稱

        ISIG

        若收到信號字符(INTR、QUIT等),則會產生相應的信號

        ICANON

        啟用規范模式

        ECHO

        啟用本地回顯功能

        ECHOE

        若設置ICANON,則允許退格操作

        ECHOK

        若設置ICANON,則KILL字符會刪除當前行

        ECHONL

        若設置ICANON,則允許回顯換行符

        ECHOCTL

        若設置ECHO,則控制字符(制表符、換行符等)會顯示成“^X”,其中X的ASCII碼等于給相應控制字符的ASCII碼加上0x40。例如:退格字符(0x08)會顯示為“^H”(’H’的ASCII碼為0x48)

        ECHOPRT

        若設置ICANON和IECHO,則刪除字符(退格符等)和被刪除的字符都會被顯示

        ECHOKE

        若設置ICANON,則允許回顯在ECHOE和ECHOPRT中設定的KILL字符

        NOFLSH

        在通常情況下,當接收到INTR、QUIT和SUSP控制字符時,會清空輸入和輸出隊列。如果設置該標志,則所有的隊列不會被清空

        TOSTOP

        若一個后臺進程試圖向它的控制終端進行寫操作,則系統向該后臺進程的進程組發送SIGTTOU信號。該信號通常終止進程的執行

        IEXTEN

        啟用輸入處理功能

        c_cc定義特殊控制特性。c_cc所支持的常量名稱如表6.13所示。

        表6.13 c_cc支持的常量名稱

        VINTR

        中斷控制字符,對應鍵為CTRL+C

        VQUIT

        退出操作符,對應鍵為CRTL+Z

        VERASE

        刪除操作符,對應鍵為Backspace(BS)

        VKILL

        刪除行符,對應鍵為CTRL+U

        VEOF

        文件結尾符,對應鍵為CTRL+D

        VEOL

        附加行結尾符,對應鍵為Carriagereturn(CR)

        VEOL2

        第二行結尾符,對應鍵為Linefeed(LF)

        VMIN

        指定最少讀取的字符數

        VTIME

        指定讀取的每個字符之間的超時時間

        下面就詳細講解設置屬性的基本流程。

        1.保存原先配置

        首先,為了安全起見和以后調試程序方便,可以先保存原先的配置,在這里可以使用函數tcgetattr(fd,old_cfg)。該函數得到fd指向的終端的配置參數,并將它們保存于termios結構變量old_cfg中。該函數還可以測試配置是否正確、該串口是否可用等。若調用成功,函數返回值為0,若調用失敗,函數返回值為-1,其使用如下所示:

        if(tcgetattr(fd,old_cfg)!=0)

        {

        perror(tcgetattr);

        return-1;

        }

        2.激活選項

        CLOCAL和CREAD分別用于本地連接和接受使能,因此,首先要通過位掩碼的方式激活這兩個選項。

        newtio.c_cflag|=CLOCAL|CREAD;

        調用cfmakeraw()函數可以將終端設置為原始模式,在后面的實例中,采用原始模式進行串口數據通信。

        cfmakeraw(new_cfg);

        3.設置波特率

        設置波特率有專門的函數,用戶不能直接通過位掩碼來操作。設置波特率的主要函數有:cfsetispeed()和cfsetospeed()。這兩個函數的使用很簡單,如下所示:

        cfsetispeed(new_cfg,B115200);

        cfsetospeed(new_cfg,B115200);

        一般地,用戶需將終端的輸入和輸出波特率設置成一樣的。這幾個函數在成功時返回0,失敗時返回-1。

        4.設置字符大小

        與設置波特率不同,設置字符大小并沒有現成可用的函數,需要用位掩碼。一般首先去除數據位中的位掩碼,再重新按要求設置。如下所示:

        new_cfg.c_cflag=~CSIZE;/*用數據位掩碼清空數據位設置*/

        new_cfg.c_cflag|=CS8;

        5.設置奇偶校驗位

        設置奇偶校驗位需要用到termios中的兩個成員:c_cflag和c_iflag。首先要激活c_cflag中的校驗位使能標志PARENB和是否要進行偶校驗,同時還要激活c_iflag中的對于輸入數據的奇偶校驗使能(INPCK)。如使能奇校驗時,代碼如下所示:

        new_cfg.c_cflag|=(PARODD|PARENB);

        new_cfg.c_iflag|=INPCK;

        而使能偶校驗時,代碼如下所示:

        new_cfg.c_cflag|=PARENB;

        new_cfg.c_cflag=~PARODD;/*清除偶校驗標志,則配置為奇校驗*/

        new_cfg.c_iflag|=INPCK;

        6.設置停止位

        設置停止位是通過激活c_cflag中的CSTOPB而實現的。若停止位為一個,則清除CSTOPB,若停止位為兩個,則激活CSTOPB。以下分別是停止位為一個和兩個比特時的代碼:

        new_cfg.c_cflag=~CSTOPB;/*將停止位設置為一個比特*/

        new_cfg.c_cflag|=CSTOPB;/*將停止位設置為兩個比特*/

        7.設置最少字符和等待時間

        在對接收字符和等待時間沒有特別要求的情況下,可以將其設置為0,則在任何情況下read()函數立即返回,如下所示:

        new_cfg.c_cc[VTIME]=0;

        new_cfg.c_cc[VMIN]=0;

        8.清除串口緩沖

        由于串口在重新設置之后,需要對當前的串口設備進行適當的處理,這時就可調用在termios.h>中聲明的tcdrain()、tcflow()、tcflush()等函數來處理目前串口緩沖中的數據,它們的格式如下所示。

        inttcdrain(intfd);/*使程序阻塞,直到輸出緩沖區的數據全部發送完畢*/

        inttcflow(intfd,intaction);/*用于暫?;蛑匦麻_始輸出*/

        inttcflush(intfd,intqueue_selector);/*用于清空輸入/輸出緩沖區*/

        linux操作系統文章專題:linux操作系統詳解(linux不再難懂)

        linux相關文章:linux教程




        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 静乐县| 南昌市| 高台县| 绥宁县| 安庆市| 息烽县| 台安县| 交城县| 万源市| 蚌埠市| 普格县| 晋城| 滨海县| 衡山县| 泰顺县| 苏州市| 峡江县| 固阳县| 图木舒克市| 马鞍山市| 高台县| 临高县| 许昌县| 郓城县| 瑞昌市| 杭锦后旗| 锦州市| 噶尔县| 灵川县| 虎林市| 峨山| 资源县| 石泉县| 苏州市| 永修县| 洪雅县| 资溪县| 资源县| 汉川市| 庆元县| 甘孜县|