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结构的指针
tcgetattr(fd, &Opt);
cfsetispeed(&opt,B9600 );
cfsetospeed(&opt,B9600);
//将修改后的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结构的指针
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结构的指针
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结构的指针
tcgetattr(fd, &opt);
…
opt.c_cflag &= ~CRTSCTS…
//将修改后的termios数据设置到串口中
tcsetattr(fd