一些常用串口属性的设置方法。
- 设置流控制
- termios_new.c_cflag &= ~CRTSCTS; //不使用流控制
- termios_new.c_cflag |= CRTSCTS; //使用硬件流控制
- termios_new.c_iflag |= IXON|IXOFF|IXANY; //使用软件流控制
- 屏蔽字符大小位
- termios_new.c_cflag &= ~CSIZE;
- 设置数据位大小
- termios_new.c_cflag |= CS8; //使用8位数据位
- termios_new.c_cflag |= CS7; //使用7位数据位
- termios_new.c_cflag |= CS6; //使用6位数据位
- termios_new.c_cflag |= CS5; //使用5位数据位
- 设置奇偶校验方式
- termios_new.c_cflag &= ~PARENB; //无奇偶校验
- termios_new.c_cflag |= PARENB; //奇校验
- termios_new.c_cflag &= ~PARODD;
- termios_new.c_cflag |= PARENB; //偶校验
- termios_new.c_cflag &= ~PARODD;
- 停止位
- termios_new.c_cflag |= CSTOPB; //2位停止位
- termios_new.c_cflag &= ~CSTOPB; //1位停止位
- 输出模式
- termios_new.c_cflag &= ~OPOST; //原始数据(RAW)输出
- 控制字符
- termios_new.c_cc[VMIN] = 1; //读取字符的最小数量
- termios_new.c_cc[VTIME] = 1; //读取第一个字符的等待时间
- 关闭终端回显,键盘输入的字符不会在终端窗口显示。
- #include <stdio.h>
- #include <stdlib.h>
- #include <termios.h>
- #include <unistd.h>
- int main(void)
- {
- struct termios ts,ots;
- char passbuf[1024];
- tcgetattr(STDIN_FILENO,&ts); /* STDIN_FILENO的值是1,表示标准输入的文件描述符 */
- ots = ts;
- ts.c_lflag &= ~ECHO; /* 关闭回终端回显功能*/
- ts.c_lflag |= ECHONL;
- tcsetattr(STDIN_FILENO,TCSAFLUSH,&ts); /* 应用新终端设置 */
- fgets(passbuf,1024,stdin); /* 输入字符不会在终端显示 */
- printf("you input character = %s/n",passbuf);
- tcsetattr(STDIN_FILENO,TCSANOW,&ots); /* 恢复旧的终端设备 */
}
例子:串口参数设置函数
int Serial::SetPara(int serialfd,int speed,int databits , int stopbits ,int parity )
{
struct termios termios_new;
bzero( &termios_new, sizeof(termios_new));//等价于memset(&termios_new,sizeof(termios_new));
cfmakeraw(&termios_new);//就是将终端设置为原始模式
termios_new.c_cflag=BaudRate(speed);
termios_new.c_cflag |= CLOCAL | CREAD; // termios_new.c_iflag = IGNPAR | IGNBRK;
termios_new.c_cflag &= ~CSIZE;
switch (databits)
{
case 0:
termios_new.c_cflag |= CS5;
break;
case 1:
termios_new.c_cflag |= CS6;
break;
case 2:
termios_new.c_cflag |= CS7;
break;
case 3:
termios_new.c_cflag |= CS8;
break;
default:
termios_new.c_cflag |= CS8;
break;
}
switch (parity)
{
case 0: //as no parity
termios_new.c_cflag &= ~PARENB; //Clear parity enable
break;
case 1:
termios_new.c_cflag |= PARENB; // Enable parity
termios_new.c_cflag &= ~PARODD;
break;
case 2:
termios_new.c_cflag |= PARENB;
termios_new.c_cflag |= ~PARODD;
break;
default:
termios_new.c_cflag &= ~PARENB; // Clear parity enable
break;
}
switch (stopbits)// set Stop Bit
{
case 1:
termios_new.c_cflag &= ~CSTOPB;
break;
case 2:
termios_new.c_cflag |= CSTOPB;
break;
default:
termios_new.c_cflag &= ~CSTOPB;
break;
}
tcflush(serialfd,TCIFLUSH); // 清除输入缓存
tcflush(serialfd,TCOFLUSH); // 清除输出缓存
termios_new.c_cc[VTIME] = 1; // MIN与 TIME组合有以下四种:1.MIN = 0 , TIME =0 有READ立即回传 否则传回 0 ,不读取任何字元
termios_new.c_cc[VMIN] = 1; // 2、 MIN = 0 , TIME >0 READ 传回读到的字元,或在十分之一秒后传回TIME 若来不及读到任何字元,则传回0
tcflush (serialfd, TCIFLUSH); // 3、 MIN > 0 , TIME =0 READ 会等待,直到MIN字元可读
return tcsetattr(serialfd,TCSANOW,&termios_new); // 4、 MIN > 0 , TIME > 0 每一格字元之间计时器即会被启动 READ 会在读到MIN字元,传回值或
}
int Serial::BaudRate( int baudrate)
{
switch(baudrate)
{
case 0:
return (B2400);
case 1:
return (B4800);
case 2:
return (B9600);
case 3:
return (B19200);
case 4:
return (B38400);
case 5:
return (B57600);
case 6:
return (B115200);
default:
return (B9600);
}
}