第一:打开需要使用的串口设备
第二:获取该串口设备的属性
第三:根据应用设置该串口的属性
第四:将设置生效
fd = open(serialDev,O_RDWR | O_NOCTTY);//第一个参数为打开的串口设备名
//第二个参数为打开设备的方式,O_RDWR以读写方式打开,O_NOCTTY该设备端口不成为该程序的控制终端
#include <termios.h> struct termios oldtio,newtio; int tcgetattr(int fd,struct termios *termios_p)
3.1 设置波特率
struct termios Opt; tcgetattr(fd, &Opt); cfsetispeed(&Opt,B19200); /*设置为19200Bps*/ cfsetospeed(&Opt,B19200);
3.2 设置数据位
struct termios options; tcgetattr( fd,&options); switch (databits) { case 6:options.c_cflag |= CS6; break;//6位数据位 case 7:options.c_cflag |= CS7; break;//7位数据位 case 8:options.c_cflag |= CS8; break; //8为数据位 }3.3 设置停止位
struct termios options; tcgetattr( fd,&options); switch (stopbits) { case 1:options.c_cflag &= ~CSTOPB;break;//每个字符1个停止位 case 2:options.c_cflag |= CSTOPB;break;//每个字符2个停止位 }3.4 设置奇偶校验
struct termios options; tcgetattr( fd,&options); options.c_cflag &= ~PARENB;//关闭奇偶校验 options.c_iflag &= ~INPCK; options.c_cflag |= (PARODD | PARENB); //设置为奇效验 options.c_iflag |= INPCK; options.c_cflag |= PARENB;//设置为偶校验 options.c_cflag &= ~PARODD; options.c_iflag |= INPCK;
3.5 设置标准模式和非标准模式
标准模式一般就是系统默认的模式,在标准模式下用户的输入一般要按下enter键后,用户的输入才会被应用程序接收到,并且用户按的回车键自动会转换为换行符。但是英语程序要求终端一有数据就能立即响应,而不是等到用户按下enter键的话,就得设置为为标准模式。
struct termios options; tcgetattr(fd,&options); options.c_lflag&= ~(ICANON | ECHO | ECHOE | ISIG);//设置为非标准模式,输入在终端不显示,不启用组合按键
在非标准模式下用户可以设置成串口一旦有数据就程序就立即可读
options.c_cc[VTIME] = 0; options.c_cc[VMIN] = 0;
当程序设置好串口的配置后必须使其生效才能使用,但是每次开机后,配置会恢复到默认值。
tcsetattr(fd,TCSAFLUSH,&options); TCSANOW: 不等数据传输完毕就立即改变属性 TCSADRAIN: 等待所有数据传输结束才改变属性 TCSAFLUSH: 清空输入输出缓冲区才改变属性
fd = open(serialDev,O_RDWR | O_NOCTTY); if(fd<0) { printf("can not open the serialDev\n"); return -1; } tcflush(fd,TCIFLUSH);//刷新 tcgetattr(fd,&newtio);//获得原先串口配置 cfsetispeed(&newtio,B38400);//设置输入的波特率为38400 cfsetospeed(&newtio,B38400);//设置输出的波特率为38400 newtio.c_cflag |= CS8; //8位数据位,1位停止位 newtio.c_cflag &= ~CSTOPB; newtio.c_cflag &= ~PARENB; //无奇偶校验 newtio.c_oflag &= ~(OPOST); //关闭输出 newtio.c_lflag &= ~(ISIG|ECHO|IEXTEN); //关闭组合按键,关闭回显 newtio.c_iflag &= ~(INPCK|BRKINT|ICRNL|ISTRIP|IXON |INLCR); newtio.c_iflag |=IGNCR; //忽略接受到回车符 if(tcsetattr(fd,TCSAFLUSH,&newtio)<0)//使设置生效 { printf("tcsetattr failed!\n"); return -1; }