Linux:串口通訊

來源:互聯網
上載者:User

以前跟著做過VxWorks的開發,主要通訊方式是串口,因為底層BSP包已經做好了,串口通訊非常簡單。後來接觸Linux,在一塊OK6410上跑Linux串口通訊,才發現原來天真的以為甚是簡單的串口變得如此的不簡單。

#include <termios.h>

1、串口的操作

1.1開啟:fd = open("/dev/ttySAC1", O_RDWR | O_NOCTTY | O_NDELAY);
              O_RDWR 讀寫方式開啟;
              O_NOCTTY 不允許進程管理串口(不太理解,一般都選上);
              O_NDELAY 非阻塞(預設為阻塞,開啟後也可以使用fcntl()重新設定)

1.2寫入:n = write(fd, "linux", 5);
                n實際寫入位元組數;

1.3讀取:res = read(fd,buf,len);
                 res 讀取的位元組數;

1.4設定:fcntl(fd, F_SETFL, FNDELAY); //非阻塞
                 fcntl(fd, F_SETFL, 0); // 阻塞

1.5關閉:close(fd);

2、串口配置

struct termios options;  // 串口配置結構體
tcgetattr(fd,&options); //擷取當前設定
bzero(&options,sizeof(options));
options.c_cflag  |= B115200 | CLOCAL | CREAD; // 設定傳輸速率,本地串連,接收使能
options.c_cflag &= ~CSIZE; //屏蔽資料位元
options.c_cflag  |= CS8; // 資料位元為 8 ,CS7 for 7
options.c_cflag &= ~CSTOPB; // 一位停止位, 兩位停止為 |= CSTOPB
options.c_cflag &= ~PARENB; // 無校正
 //options.c_cflag |= PARENB; //有校正
//options.c_cflag &= ~PARODD // 偶校正
//options.c_cflag |=  PARODD    // 奇數同位
options.c_cc[VTIME] = 0; // 等待時間,單位百毫秒 (讀)。後有詳細說明
options.c_cc[VMIN] = 0; // 最小位元組數 (讀)。後有詳細說明
tcflush(fd, TCIOFLUSH); // TCIFLUSH刷清輸入隊列。
                                       TCOFLUSH刷清輸出隊列。 
                                       TCIOFLUSH刷清輸入、輸出隊列。
tcsetattr(fd, TCSANOW, &options); // TCSANOW立即生效;
                                                        TCSADRAIN:Wait until everything has been transmitted;
                                                        TCSAFLUSH:Flush input and output buffers and make the change

3、VTIME 和  VMIN

VTIME  定義要求等待的零到幾百毫秒的值(通常是一個8位的unsigned char變數)。
VMIN 定義了要求等待的最小位元組數, 這個位元組數可能是0。
只有設定為阻塞時這兩個參數才有效,僅針對於讀操作。
說起來比較複雜,舉個例子吧,設定為阻塞狀態,寫操作未進行實驗,這裡僅討論讀操作,
read(fd,&buf,8); // 讀串口

3.1
options.c_cc[VTIME] = 0;
options.c_cc[VMIN] = 0;
VMIN = 0,當緩衝區位元組數 >= 0 時進行讀操作,實際上這時讀串口操作並未被阻塞,因為條件始終被滿足。

3.2
options.c_cc[VTIME] = 0;
options.c_cc[VMIN] = 1;
VMIN = 1,當緩衝區位元組數 >= 1 時進行讀操作,當沒有資料時讀串口操作被阻塞。

3.3
options.c_cc[VTIME] = 0;
options.c_cc[VMIN] = 4;
VMIN = 4,當緩衝區位元組數 >= 4 時進行讀操作,否則讀串口操作被阻塞。每次讀出的最大位元組數由read函數中第三個參數決定。直到緩衝區剩下的資料< read 第三個參數 並且< 4 (如果這時read第三參數為 1 則進行4次讀操作直至讀完緩衝區,如read第三參數為2,連續進行讀操作,直至緩衝區空或還剩一個字元)。沒有設定VTIME,剩下的字元沒有確定的期限,直到下次滿足讀條件的時候才被讀出。

----------------------------------考慮VTIME-----------------------------

3.4
options.c_cc[VTIME] = 10; //單位百毫秒
options.c_cc[VMIN] = 4;
同3.3的區別就是,沒滿足條件或讀緩衝區中剩下的資料會在1秒(10百毫秒)後讀出。另外特別注意的是當設定VTIME後,如果read第三個參數小於VMIN ,將會將VMIN 修改為read的第三個參數,即使用read(fd,&buf,2);,以上設定變為:
options.c_cc[VTIME] = 10;
options.c_cc[VMIN] = 2;

 

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.