linux 串列埠概述

2021-05-25 12:09:46 字數 3609 閱讀 2627

串列埠概述

使用者常見的資料通訊的基本方式可分為並行通訊和序列通訊。

並行通訊是指利用多條資料傳輸線將乙個資料的各位同時傳送。特點是傳輸速度快,適用於短距離通訊,但要求傳輸速度較 高的應用場合。

序列通訊是指利用一條傳輸線將資料一位位的順序傳送。特點是通訊線路簡單,利用簡單的線纜就可以實現通訊,減低成 本,適用於遠距離通訊,但傳輸速度慢的應用場合。常用的串列埠有rs-232-c 接 口(全稱是「資料終端裝置(dte )和資料通訊裝置(dce )之間序列二進位制資料交換接**術標準」)。

uart 控制器:可以工作在interrupt (中斷)模式或者dma (直接記憶體訪問)模式。據有16位元組的fifo(先入先出暫存器),支援最高波特率可達到230. 4kbps。

uart 操作:資料傳送、資料接收、產 生中斷、產生波特率、loopback 模式、紅外模式及自動流控制模式。

串列埠設定包括:波特率、起始位數量、資料位數量、停止位數量和流控協議。在此可以配置波特率為115200 、起始位為1b 、 資料位8b 、停止位1b 和無流控制協議。 串列埠

一、串列埠二對應裝置名依次是「/dev/ttys0 」、 「/dev/ttys1 」。

在linux 下對串列埠的讀寫可以使用簡 單的「read 」、「write 」函式完成,不同的是需要對串列埠的其它引數另作設定。

6.4.2 串列埠設定詳情

串列埠設定主要是設定struct termios 結 構體成員值:

#include

struct termio ;

通過對c_cflag 的賦值,可以設定 波特率、字元大小、資料位、停止位、奇偶校驗位和硬體流控等。

設定串列埠屬性基本流程:

1.       儲存原先串列埠配置

為了安全起見和以後除錯程式方便,可先儲存原先串列埠的配置,使用函式tcgetattr (fd ,&oldtio )。該函式得到與fd 指向物件的相關引數,並將它們儲存於lodtio 引 用的termios 結構中。該函式可以測試配置是否正確、該串列埠是否可用等。 除錯成功,函式返回0 ,失敗,函式返回-1.

if(tcgetattr(fd,&oldtio)!=0)

2.       啟用選項有clocal 和cread

clocal 和cread 分別用於本地連線和接受使能,通過位掩碼的方式啟用這兩個選項。

newtio.c_cflag |= clocal | cread;

3.       設定波特率

設定波特率的函式主要有cfsetispeed 和cfsetospeed 。

cfsetispeed(&newtio,b115200);

cfsetospeed(&newtio,b115200);

一般地使用者需要將輸入輸出函式的波特率設定成一樣的。這幾個函式在成功時返回0 ,失敗-1 。

4.       設定字元大小

沒有現成可用函式,需要位掩碼。一般先去除資料位中的位掩碼,再重新按要求設定。

options.c_cflag &= ~csize; /*mask the character size bits*/

options.c_cflag |= cs8;

5.       設定奇偶校驗位

先啟用c_cflag 中的校驗位使能標 志parenb 和是否要進行偶校驗,同時還要啟用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 &= ~parood;

6.       設定停止位

通過啟用c_cflag 中的cstopb 而實現的。若停止位為1 ,則清除cstopb ,若停止位為0 ,則啟用cstopb 。 下面是停止位為1 時的**:

newtio.c_cflag &= ~cstopb;

7.       設定最少字元和等待 時間

在對接收字元和等待時間沒有特別要求的情況下,可以將其設定為0 :

newtio.c_cc[vtime] =0;

newtio.c_cc[vmin]=0;

8.       處理要寫入的引用對 象

在串列埠重新設定之後,在之前要寫入的引用物件要重新處理,可呼叫函式tcflush(fd,queue_selector) 來處理要寫入引用的物件。對於為傳輸的資料,或收到但未讀取的資料, 其處理方法取決於queue_selector 的值。

queue_selector 可能取 值:

tciflush :重新整理收到的資料但不 讀

tcoflush :重新整理寫入的資料但不 傳送

tciolflush :同時重新整理收到的 資料但不讀,並且重新整理寫入的資料但不傳送

本例採用一:

tcflush(fd, tciflush)

9.       啟用配置

用到函式tcsetattr:

函式原型:tcsetattr(fd,option,&newtio);

這裡的newtio 就是termios 型別的變數,option 可 能的取值如下:

tcsanow :改變的配置立即生效

tcsadrain :改變的配置在所有 寫入fd 的輸出都結束後生效

tcsaflush :改變的配置自愛所 有寫入fd 引用物件的輸出都被結束後生效,所有已接受但為讀入的輸入都在改變 發生前丟棄。

該函式呼叫成功返回0 ,失敗-1.

if((tcsetattr(fd,tcsanow,&newtio))!=0)

/*串列埠配置的完整函式,為了函式的通用性,通常將常用的選項都在 函式中列出,可大大方便以後使用者的除錯使用*/

int set_opt(int fd,int nspeed,int nbits,char nevent,int nstop)

bzero(&newtio,sizeof(newtio));

/* 步驟一,設定字元大小*/

newtio.c_cflag |= clocal | cread;

newtio.c_cflag &= ~csize;

/*設定停止位*/

switch(nbits)

/*設定奇偶校驗位*/

switch(nevent)

/*設定波特率*/

switch(nspeed)

/*設定停止位*/

if(nstop==1)

newtio.c_cflag &= ~cstopb;

else if(nstop==2)

newtio.c_cflag |= cstopb;

/*設定等待時 間和最小接收字元*/

newtio.c_cc[vtime] =0;

newtio.c_cc[vmin]=0;

/*處理未接受字 符*/

tcflush(fd, tciflush);

/*啟用新配置*/

if((tcsetattr(fd,tcsanow,&newtio))!=0)

printf("set done!/n");

return 0;}

準備篇 串列埠通訊概述

前言 最近家裡有些事情所以這個系列的文章一直耽擱了,現在開始進行編寫希望各位看官見諒,這個系列是我對之前一段時間工作的總結也是我自己的複習和重構,本著互相學習的目的,如果我在其中有理解錯誤和方向不對的地方還請大家指正。1.1 什麼是串列埠 什麼是串列埠其實應該首先說什麼是通訊,不過 通訊 二字對於我...

Linux串列埠除錯

在第一次除錯linux串列埠驅動的時候,一定要保證與linux串列埠通訊的器件是沒有問題可以使用的,然後我們再進行串列埠操作的學習,否則也許可能碰到問 題的時候不知如何處理了。好了,在保證硬體已經沒有問題的情況下,我們開始學習串列埠驅動模組的使用。pc上的串列埠不比嵌入式,你可以在了解了暫存器之後操...

linux串列埠除錯

在第一次除錯linux串列埠驅動的時候,一定要保證與linux串列埠通訊的器件是沒有問題可以使用的,然後我們再進行串列埠操作的學習,否則也許可能碰到問題的時候不知如何處理了。好了,在保證硬體已經沒有問題的情況下,我們開始學習串列埠驅動模組的使用。pc上的串列埠不比嵌入式,你可以在了解了暫存器之後操作...