在linux系統中,串列埠裝置是通過串列埠終端裝置檔案來訪問的,也就是通過訪問/dev/ttys0、/dev/ttys1、/dev/ttys2、/dev/ttys3這些裝置檔案實現對串列埠的訪問。對串列埠進行讀寫要經過下面幾個步驟。
一、 開啟串列埠
與開啟檔案類似,開啟串列埠同樣使用open函式。注意對於串列埠的開啟操作,必須使用o_noctty引數。該引數表示:如果開啟的是乙個終端裝置,程式不會成為對應這個埠的控制終端。如果沒有使用該標誌,任何乙個輸入(例如,鍵盤中止訊號等)都將影響程序。具體**如下:
#include #include #includeint 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 都是公口介面 必須使用兩個母口進行連線裝置 所有的工作準備好後,往串列埠傳送命令,啟用裝置時。不管...