Linux系統 串列埠裝置

2021-06-16 17:21:43 字數 4555 閱讀 2687

在linux系統中,串列埠裝置是通過串列埠終端裝置檔案來訪問的,也就是通過訪問/dev/ttys0、/dev/ttys1、/dev/ttys2、/dev/ttys3這些裝置檔案實現對串列埠的訪問。對串列埠進行讀寫要經過下面幾個步驟。

一、  開啟串列埠

與開啟檔案類似,開啟串列埠同樣使用open函式。注意對於串列埠的開啟操作,必須使用o_noctty引數。該引數表示:如果開啟的是乙個終端裝置,程式不會成為對應這個埠的控制終端。如果沒有使用該標誌,任何乙個輸入(例如,鍵盤中止訊號等)都將影響程序。具體**如下:

#include #include #include 

int main(void)

二、  設定串列埠通訊引數

串列埠通訊引數指的是波特率、資料位、奇偶校驗位和停止位。對串列埠實現控制的時候同樣要用到termio結構體。下面將結合具體的**說明如何設定這些引數。

1.波特率設定

獲得埠波特率資訊是通過cfgetispeed函式和cfgetospeed函式來實現的。cfgetispeed函式用於獲得結構體termios_p中的輸入波特率資訊,而cfgetospeed函式用於獲得結構體termios_p中的輸出波特率資訊。這兩個函式的具體資訊如表6.9所示。

表6.9   cfgetispeed函式和cfgetospeed函式

標頭檔案函式形式

speed_t cfgetispeed(const struct termios *termios_p);

speed_t cfgetospeed(const struct termios *termios_p);

返回值成功

失敗是否設定errno

返回termios_p結構中的輸入/輸出埠的波特率−1是

cfsetispeed函式和cfsetospeed函式用於設定埠的輸入/輸出波特率。一般情況下,輸入和輸出波特率是相等的。cfsetispeed函式和cfsetospeed函式的函式宣告資訊如表6.10所示。

表6.10   cfsetispeed函式和cfsetospeed函式

標頭檔案函式形式

int cfsetispeed(struct termios *termios_p, speed_t speed);

int cfsetospeed(struct termios *termios_p, speed_t speed);

返回值成功

失敗是否設定errno

返回termios_p結構中的輸入/輸出埠的波特率−1是

cfsetispeed函式和cfsetospeed函式會修改結構體termios_p中的波特率資訊,其中引數speed可以使用表6.11中所列出的巨集。

表6.11   speed引數常用波特率資訊 

巨集  定  義

波特率(單位:bit/s)

巨集  定  義

波特率(單位:bit/s)

b0b1800

b50b2400

b75b4800

b110

b9600

b134

b19200

b150

b38400

b200

b57600

b300

b115200

b600

b230400

b1200

使用cfsetispeed函式和cfsetospeed函式進行串列埠波特率設定具體**如下所示:

#include //標頭檔案定義

#include #include < termios.h >

……struct termios opt;           /*定義指向termios 結構型別的指標opt*/

……//獲得串列埠指向termios結構的指標

tcgetattr(fd, &opt);

cfsetispeed(&opt,b9600 ); /*指定輸入波特率,9600bps*/

cfsetospeed(&opt,b9600);/*指定輸出波特率,9600bps*/

//將修改後的termios資料設定到串列埠中

tcsetattr(fd,tcanow,&opt);

……

2.資料位

資料位指的是每位元組中實際資料所佔的位元數。要修改資料位可以通過修改termios結構體中c_cflag成員來實現。cs5、cs6、cs7和cs8分別表示資料位為5、6、7和8。值得注意的是,在設定資料位時,必須先使用csize做位遮蔽。具體設定**如下:

#include //標頭檔案定義

#include #include < termios.h >

……struct termios opt;           /*定義指向termios 結構型別的指標opt*/

.......

//獲得串列埠指向termios結構的指標

tcgetattr(fd, &opt);

…//遮蔽其他標誌

opt.c_cflag&=~csize;

//將資料位修改為8bit

opt.c_cflag |=cs8;

…//將修改後的termios資料設定到串列埠中

tcsetattr(fd,tcanow,&opt);

……

3.奇偶校驗位

奇偶校驗可以選擇偶校驗、奇校驗、空格等方式,也可以不使用校驗。如果要設定為偶校驗的話,首先要將termios結構體中c_cflag設定parenb標誌,並清除parodd標誌。如果要設定奇校驗,要同時設定termios結構體中c_cflag設定parenb標誌和parodd標誌。如果不想使用任何校驗的話,清除termios結構體中c_cflag的parenb位。表6.12所示為設定奇偶校驗的具體方法。

表6.12   設定奇偶校驗位

設    置

具 體 代 碼

無校驗opt.c_cflag &= ~parenb;

奇校驗opt.c_cflag |= (parodd | parenb);

偶校驗opt.c_cflag &= ~ parenb;

opt.c_cflag &= ~parodd;

空格opt.c_cflag &= ~parenb;

opt.c_cflag &= ~cstopb;

下面給出將串列埠通訊的奇偶校驗設定為偶校驗的例子,具體**如下:

#include //標頭檔案定義

#include #include < termios.h >

……struct termios opt;           /*定義指向termios 結構型別的指標opt*/

……//獲得串列埠指向termios結構的指標

tcgetattr(fd, &opt);

…opt.c_cflag &= ~ parenb;

opt.c_cflag &= ~parodd;

…//將修改後的termios資料設定到串列埠中

tcsetattr(fd,tcanow,&opt);

……

4.資料流控制

資料流控制指是使用何種方法來標誌資料傳輸的開始和結束。可以選擇不使用資料流控制、使用硬體進行流控制和使用軟體進行流控制。資料流控制設定如表6.13所示。

表6.13  資料流控制設定

設    置

具 體 代 碼

不使用資料流控制

opt.c_cflag &= ~crtscts

硬體opt.c_cflag   |=  crtscts

軟體opt.c_cflag   | = ixon|ixoff|ixany

#include //標頭檔案定義

#include #include < termios.h >

……struct termios opt;           /*定義指向termios 結構型別的指標opt*/

……//獲得串列埠指向termios結構的指標

tcgetattr(fd, &opt);

…opt.c_cflag &= ~crtscts…

//將修改後的termios資料設定到串列埠中

tcsetattr(fd,tcanow,&opt);

……

三、  讀寫串列埠

讀寫串列埠是通過使用read函式和write函式實現的。在linux系統中,對裝置的讀寫類似於對檔案的讀寫。下面給出對串列埠的寫操作的**:

……

int len;

//待傳送資料

char sbuf=;

int send_len=sizeof(sbuf);

//傳送緩衝區位元組數定義

len= write(fd,sbuf,send_len); //

if(n == -1)

printf("wirte sbuf error./n");

……

四、 關閉串列埠

在完成對裝置檔案讀寫操作後,需要呼叫close函式關閉該檔案描述符。

Ubuntu 系統繫結裝置串列埠名稱

步驟如下 一 插上裝置,使用lsusb命令檢視裝置的id號 形式如id 1a86 7523 二 在資料夾 etc udev rules.d下新建乙個檔案為 rules 三 在該檔案下寫上 kernel ttyusb attrs 1a86 attrs 7523 mode 0666 symlink he...

linux裝置驅動之串列埠移植

1 串列埠移植 s3c2440共有3個串列埠,在smdk2440平台上串列埠0和串列埠1都作為普通串列埠使用,串列埠2工作在紅外收發模式。tq2440開發板將它們都作為普通串列埠,目前所需要的只有串列埠0,作為控制終端,所以此處不作修改。在檔案 linux arch arm plat s3c24xx...

Wince系統Pad串列埠連線外接裝置

最近開發一款馬拉松跑道專案 wince使用串列埠傳送命名後裝置沒有正確回應?使用wince 系統的pad進 與外接裝置通訊,之前使用標準的串列埠線 wince pad 的com口 有com2 com3 都是公口介面 必須使用兩個母口進行連線裝置 所有的工作準備好後,往串列埠傳送命令,啟用裝置時。不管...