设置串口属性

来源:互联网 发布:渭南广电网络官网 编辑:程序博客网 时间:2024/05/23 19:02
INT32 set_termios_attr(INT32 fd,INT32 nBits,INT32 stopBits,char oodeven,INT32 iBaudRate)
{
    struct termios new_termios;

/*备份串口终端属性*/
if(tcgetattr(fd,&g_old_termios))
{
log_printf(ERROR_LEVEL,SHELL_MODULE,"tcgetattr fail.\n");
return RUN_ERROR;
}
/*设置串口终端属性*/
new_termios.c_cflag |= CLOCAL | CREAD;
new_termios.c_cflag &= ~CSIZE; /*去除位掩码*/
switch(nBits)  /*数据位*/
{
case 5:  new_termios.c_cflag |= CS5;break;
case 6:  new_termios.c_cflag |= CS6;break;
case 7:  new_termios.c_cflag |= CS7;break;
case 8:  new_termios.c_cflag |= CS8;break;
default: break;
}


if(2 == stopBits)
{
new_termios.c_cflag |= CSTOPB;  /*2位停止位*/
}
else
{
new_termios.c_cflag &= ~CSTOPB; /*1位停止位*/
}
/*设置奇偶校验位*/
switch(oodeven)
{
case 'O' : /*奇校验*/
new_termios.c_cflag |= PARENB;
new_termios.c_cflag |= PARODD;
new_termios.c_lflag |= (INPCK | ISTRIP);
break;
case 'E' : /*偶校验*/
new_termios.c_cflag |= PARENB;
new_termios.c_cflag &= ~PARODD;
new_termios.c_lflag |= (INPCK | ISTRIP);
break;
case 'N':
new_termios.c_cflag &= ~PARENB; /*无奇偶校验*/
break;
default:
break;
}

switch(iBaudRate)  /*波特率*/
{
case 1200: cfsetospeed(&new_termios,B1200); cfsetispeed(&new_termios,B1200);break;
case 2400: cfsetospeed(&new_termios,B2400); cfsetispeed(&new_termios,B2400);break;
case 4800: cfsetospeed(&new_termios,B4800); cfsetispeed(&new_termios,B4800);break;
case 9600: cfsetospeed(&new_termios,B9600); cfsetispeed(&new_termios,B9600);break;
case 19200: cfsetospeed(&new_termios,B19200);cfsetispeed(&new_termios,B19200); break;
case 38400: cfsetospeed(&new_termios,B38400);cfsetispeed(&new_termios,B38400); break;
case 57600: cfsetospeed(&new_termios,B57600);cfsetispeed(&new_termios,B57600); break;
case 115200: cfsetospeed(&new_termios,B115200);cfsetispeed(&new_termios,B115200); break;
case 230400: cfsetospeed(&new_termios,B230400);cfsetispeed(&new_termios,B230400); break;
default:break;
}


new_termios.c_cc[VTIME] = 0; /*对接收字符和等待时间没有特别要求*/
new_termios.c_cc[VMIN] = 0; /*设置最小接收字符*/



//new_termios.c_lflag &= ~IXON;  /*禁止输出的XON/XOFF流控制*/
//new_termios.c_lflag &= ~IXOFF;  /*禁止输入的XON/XOFF流控制*/


new_termios.c_lflag |= ICANON;  /*启用标准模式*/
//new_termios.c_lflag |= ECHO;  /*回显输入字符*/
//new_termios.c_lflag &= ~ECHOE; /*如果设置了ICANON,字符ERASE擦除前一个输入字符*/


tcflush(fd,TCIFLUSH); /*刷新收到的数据但不读*/
//tcflush(fd,TCOFLUSH); /*刷新写入的数据但不传送*/
//tcflush(fd,TCIOFLUSH); /*同时刷新收到的数据但不读,刷新写入的数据但不传送*/
if(tcsetattr(fd,TCSAFLUSH,&new_termios)) /*TCSANOW*/
{
log_printf(ERROR_LEVEL,SHELL_MODULE,"tcsetattr fail.\n");
return RUN_ERROR;
}

return RUN_OK;
}
0 0
原创粉丝点击