設置串口通信參數


6.7.2 設置串口通信參數

串口通信參數指的是波特率、數據位、奇偶校驗位和停止位。對串口實現控制的時候同樣要用到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

B0

0

B1800

1800

B50

50

B2400

2400

B75

75

B4800

4800

B110

110

B9600

9600

B134

134

B19200

19200

B150

150

B38400

38400

B200

200

B57600

57600

B300

300

B115200

115200

B600

600

B230400

230400

B1200

1200

   

 

使用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);
……

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM