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 //頭文件定義 |
2.數據位
數據位指的是每字節中實際數據所占的比特數。要修改數據位可以通過修改termios結構體中c_cflag成員來實現。CS5、CS6、CS7和CS8分別表示數據位為5、6、7和8。值得注意的是,在設置數據位時,必須先使用CSIZE做位屏蔽。具體設置代碼如下:
#include //頭文件定義 //將修改后的termios數據設置到串口中 |
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 //頭文件定義 //將修改后的termios數據設置到串口中 |
4.數據流控制
數據流控制指是使用何種方法來標志數據傳輸的開始和結束。可以選擇不使用數據流控制、使用硬件進行流控制和使用軟件進行流控制。數據流控制設置如表6.13所示。
表6.13 數據流控制設置
設 置 |
具 體 代 碼 |
不使用數據流控制 |
opt.c_cflag &= ~CRTSCTS |
硬件 |
opt.c_cflag |= CRTSCTS |
軟件 |
opt.c_cflag | = IXON|IXOFF|IXANY |
由於使用硬件流控制需要相應連接的電纜,常用的流控制方法還是使用軟件進行流控制。下面給出了設置不使用數據流控制的相關代碼:
#include //頭文件定義
//將修改后的termios數據設置到串口中
|