分类: LINUX
2012-08-10 10:26:10
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函数进行串口波特率设置具体代码如下所示:
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 |
由于使用硬件流控制需要相应连接的电缆(就是RTS,CTS那两根线要连起来),常用的流控制方法还是使用软件进行流控制(虽然硬件流MS更牛,但还是软件流更常用)。下面给出了设置不使用数据流控制的相关代码:
#include //头文件定义//将修改后的termios数据设置到串口中
tcsetattr(fd,TCANOW,&Opt);