项目场景:
Linux 下串口编程 串口处于回环模式
使用POSIX 接口,C编程
问题描述
串口处于回环模式,即:收到的数据会再次转发出来
原因分析:
没有对串口进行设置raw 和 关闭 echo:
例如:使用 stty -F /dev/ttySx -echo raw,则正常。 检查代码后发现 是没有对串口进行设置 初始化代码如下
解决方案:
struct termios newtio, oldtio;
if ( tcgetattr ( fd, &oldtio) !=0)
{
qDebug("setSerial tcgetattr Failed!");
return -1;
}
bzero ( &newtio, sizeof( newtio ) );
//设置字符大小
newtio.c_cflag |= CLOCAL | CREAD;
newtio.c_cflag &= ~CSIZE;
//设置数据位
switch( nBits)
{
case 7:
newtio.c_cflag |=CS7;
break;
case 8:
newtio.c_cflag |=CS8;
break;
default:
newtio.c_cflag |=CS8;
break;
}
//设置奇偶校验位
switch ( nEvent)
{
case 'o': //奇数
case 'O': //奇数
newtio.c_cflag |= PARENB;
newtio.c_cflag |= PARODD;
if(nBits==7)
{
newtio.c_iflag |= (INPCK | ISTRIP);
}
else
{
newtio.c_cflag |= INPCK;
}
break;
case 'e': //偶数
case 'E': //偶数
newtio.c_cflag |= PARENB;
newtio.c_cflag &= ~PARODD;
if(nBits==7)
{
newtio.c_iflag |= (INPCK | ISTRIP); //ISTRIP 如果设置,所接收到的所有字节的高位将会被去除,保证它们是一个7位的字符
}
else
{
newtio.c_cflag |= INPCK; //如果设置,则进行奇偶校验
}
break;
case 'n': //无校验位
case 'N':
newtio.c_cflag &= ~PARENB; /* Clear parity enable */
//newtio.c_iflag &= ~INPCK; /* Enable parity checking */
break;
default:
newtio.c_cflag &= ~PARENB;
break;
}
//波特率
//波特率
switch ( nSpeed)
{
case BAUDRATE300:
cfsetispeed (&newtio, B300) ;
cfsetospeed (&newtio, B300) ;
break;
case BAUDRATE600:
cfsetispeed (&newtio, B600) ;
cfsetospeed (&newtio, B600) ;
break;
case BAUDRATE1200:
cfsetispeed (&newtio, B1200) ;
cfsetospeed (&newtio, B1200) ;
break;
case BAUDRATE2400:
cfsetispeed (&newtio, B2400) ;
cfsetospeed (&newtio, B2400) ;
break;
case BAUDRATE4800:
cfsetispeed (&newtio, B4800) ;
cfsetospeed (&newtio, B4800) ;
break;
case BAUDRATE9600:
cfsetispeed (&newtio, B9600) ;
cfsetospeed (&newtio, B9600) ;
break;
case BAUDRATE19200:
cfsetispeed (&newtio, B19200) ;
cfsetospeed (&newtio, B19200) ;
break;
case BAUDRATE38400:
cfsetispeed (&newtio, B38400) ;
cfsetospeed (&newtio, B38400) ;
break;
case BAUDRATE57600:
cfsetispeed (&newtio, B57600) ;
cfsetospeed (&newtio, B57600) ;
break;
case BAUDRATE115200:
cfsetispeed (&newtio, B115200) ;
cfsetospeed (&newtio, B115200) ;
break;
default :
cfsetispeed (&newtio, B9600) ;
cfsetospeed (&newtio, B9600) ;
break;
}
//停止位
if ( nStop == 1 ) newtio.c_cflag &= ~CSTOPB;
else if ( nStop == 2 ) newtio.c_cflag |= CSTOPB;
//流控
// newtio.c_cflag |=CRTSCTS;
//设置等待时间和最小接收字符
newtio.c_cc[VTIME] = 1;
newtio.c_cc[VMIN] = 0;
//处理未接收字符 清空输入缓冲区
tcflush ( fd, TCIFLUSH);
//需要注意的是: 如果不是开发终端之类的,只是串口传输数据,而不需要串口来处理,那么使用原始模式(Raw Mode)方式来通讯,设置方式如下:
newtio.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG); /*Input*/
newtio.c_oflag &= ~OPOST; /*Output*/
//激活新配置
if ( (tcsetattr (fd, TCSANOW, &newtio) ) !=0)
{
qDebug("serialSet tcsetattr Failed!");
return -1;
}
//恢复串口为阻塞状态
//测试是否为终端设备
if ( fcntl (fd, F_SETFL, 0) <0 || isatty( STDIN_FILENO ) == 0 )
{
qDebug("Standard input is not a terminal device.");
return -1;
}
6627

被折叠的 条评论
为什么被折叠?



