linux串口編程(要點總結)

來源:互聯網
上載者:User

串口編程
查詢硬體的方式:查詢方式、中斷方式、DMA方式。串口很多是使用中斷方式,這種方式一般來講對CPU比較有效。

UART的操作主要包括以下幾個部分:
      資料發送;資料接受;產生中斷;產生傳輸速率;Loopback模式;紅外模式;自動流控模式;
      串口參數的配置主要包括:傳輸速率、資料位元、停止位、流控協議。

在linux下操作串口與操作檔案相同。

在使用串口之前必須設定相關配置,包括:傳輸速率、資料位元、校正位、停止位等。串口設定由下面結構體實現。
     Struct termios{
                 tcflag_t c_iflag;  /* input flags */
                 tcflag_t c_oflag;  /* output flags */
                 tcflag_t c_cflag;  /* control flags */
                 tcflag_t c_lflag;  /* local flags */
                 cc_t  c_cc[NCCS]; /* control character */
     };

串口配置流程
    1、儲存原先串口配置,使用tcgetattr(fd,&oldtio)函數
         struct termios newtio,oldtio;
          tcgetattr(fd,&oldtio);
     2、啟用選項,有CLOCAL 和CREAD,用於本地串連和接收使能。
           newtio.c_cflag |= CLOCAL | CREAD
     3、設定傳輸速率,使用函數cfsetispeed、cfsetospeed。
            cfsetipeed(&newtio, B115200);
            cfsetospeed(&newtio, B115200);
     4、設定資料位元,需要使用掩碼設定。
             newtio.c_cflag &= ~CSIZE;
             newtio.c_cflag |= CS8;
     5、設定同位位元,使用c_cflag和c_iflag。
            設定奇數同位:
            newtio.c_cflag |= PARENB;
            newtio.c_cflag |= PARODD;
             newtio.c_iflag |= (INPCK | ISTRIP);
             設定歐校正:
             newtio.c_iflag |= (INPCK | ISTRIP);
             newtio.c_cflag |= PARENB;
             newtio.c_cflag &= ~PARODD;
      6、設定停止位,通過啟用c_cflag中的CSTOPB實現。若停止位為1,則清楚CSTOPB,若停止位為2,則  啟用CSTOPB。
            newtio.c_cflag &= ~CSTOPB;
      7、設定最少字元和等待時間,對於接受字元和等待時間沒有特別要求時,可設為0。
            newtio.c_cc[VTIME] = 0;
            newtio.c_cc[VMIN] = 0;
      8、處理要寫入的引用對象
             tcflush函數刷清(拋棄)輸入緩衝(終端驅動程式已接收到,但使用者程式尚未讀)
             或輸出緩衝(使用者程式已寫,但尚未發送)。
             int tcflush(int filedes, int queue)
              queue數應當是下列三個常數之一:
              TCIFLUSH 刷清輸入隊列。
              TCOFLUSH 刷清輸出隊列。
              TCIOFLUSH 刷清輸入、輸出隊列。
       9、啟用配置。在完成配置後,需啟用配置使其生效。
             使用tsettattr()函數。原型:
              int tcgetattr(int filedes, struct termios *termptr);
              int tcgetattr(int filedes, int opt, const struct termios * termptr);
               tcsetattr的參數opt使我們可以指定在什麼時候新的終端屬性才起作用。opt可以指定wei下列常數中的一  個:
              TCSANOW 更改立即發生。
               TCSADRAIN 發送了所有輸出後更改才發生。若更改輸出參數則應使用此選擇項。
               TCSAFLUSH 發送了所有輸出後更改才發生。更進一步,在更改發生時未讀的宋有輸入資料都被刪除(刷清)
              使用如:tcsetattr(fd, TCSANOW, &newtio)

開啟串口
           f d = open("/dev/ttyS0", O_RDWR|O_NOCTTY|O_NDELAY);

           open函數中除普通參數外,另有兩個參數O_NOCTTY和O_NDELAY。
           O_NOCTTY:通知linux系統,這個程式不會成為這個連接埠的控制終端。
            O_NDELAY:通知linux系統不關心DCD訊號線所處的狀態(連接埠的另一端是否啟用或者停止)
           然後,恢複串口的狀態為阻塞狀態,用於等待串口資料的讀入。用fcntl函數:
            fcntl(fd, F_SETFEL, 0);
 
           接著, 測試開啟的檔案描述符是否引用一個終端裝置,以進一步確認串口是否正確開啟.
            isatty(STDIN_FILENO);

串口讀寫
            串口的讀寫與普通檔案的讀寫是一樣的,使用read,write函數。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.