Linux系統中設定串列埠屬性的基本流程

2021-07-05 13:30:53 字數 3716 閱讀 8412

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

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

序列通訊是指利用一條傳輸線將資料一位位的順序傳送。特點是通訊線路簡單,利用簡單的線纜就可以實現通訊,減低成本,適用於遠距離通訊,但傳輸速度慢的應用場合。常用的串列埠有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《termios.h》

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;

}上面就是linux下串列埠設定的介紹了,需要設定的地方有點多,初學者可能會用到該方面的知識,希望上面介紹的方法能夠幫助到你

Linux串列埠的設定

設定流控制 termios new.c cflag crtscts 不使用流控制 termios new.c cflag crtscts 使用硬體流控制 termios new.c iflag ixon ixoff ixany 使用軟體流控制 設定資料位大小 termios new.c cflag ...

串列埠屬性設定 Labview串列埠資源浪費解析

什麼是串列埠 序列介面是指資料一位一位地順序傳送,其特點是通訊線路簡單,只要一對傳輸線就可以實現雙向通訊,從而大大降低了成本,特別適用於遠距離通訊,但傳送速度比較慢。而一條資訊的各位資料被逐位按順序傳送的通訊方式稱為序列通訊介面,序列通訊介面的特點是 資料位的傳送,按位順序進行,最少只需一根傳輸線即...

linux 串列埠設定流程

串列埠設定主要是設定struct termios結構體成員值 include struct termio 通過對c cflag的賦值,可以設定波特率 字元大小 資料位 停止位 奇偶校驗位和硬體流控等。1.儲存原先串列埠配置 為了安全起見和以後除錯程式方便,可先儲存原先串列埠的配置,使用函式tcget...