23,120
社区成员
发帖
与我相关
我的任务
分享
/*
初始化串口,配置串口的各种参数。
参数:BaudRate:波特率
DataBits:数据位
StopBits:停止位
ParityBit:校验位
*/
bool SerialPort ::InitSerialPort(int BaudRate,int DataBits,int StopBits,int ParityBit)
{
if( -1 == fd)
return false;
if( 0!= tcgetattr (fd,&m_Setting))
{
printf("InitSerialPort tcgetattr() line:%d failed\n",__LINE__);
return false;
}
// 设置波特率
for(int i = 0 ; i<sizeof(m_SpeedArr)/sizeof(int);i++)
{
if( BaudRate == m_SpeedArr[i])
{
tcflush(fd, TCIOFLUSH); // 清空发送接收缓冲区
cfsetispeed(&m_Setting,m_BaudRateArr[i]); // 设置输入波特率
cfsetospeed(&m_Setting,m_BaudRateArr[i]); // 设置输出波特率
break;
}
if(i == sizeof(m_SpeedArr) / sizeof(int))
return false;
}
m_Setting.c_cflag |= CLOCAL;//控制模式, 保证程序不会成为端口的占有者
m_Setting.c_cflag |= CREAD; //控制模式, 使能端口读取输入的数据
// 设置数据位
m_Setting.c_cflag &= ~CSIZE;
switch(DataBits)
{
case 6:m_Setting.c_cflag |= CS6 ; break; //6位数据位
case 7:m_Setting.c_cflag |= CS7 ; break; //7位数据位
case 8:m_Setting.c_cflag |= CS8 ; break; //8位数据位
default:
fprintf(stderr,"unsupported dataBits\n");
return false;
}
// 设置停止位
switch(StopBits)
{
case 1: m_Setting.c_cflag &= ~CSTOPB;break; //1位停止位
case 2: m_Setting.c_cflag |= CSTOPB; break; //2位停止位
default:
return false;
}
// 设置奇偶校验位
switch(ParityBit)
{
case 'n':
case 'N':
m_Setting.c_cflag &= ~PARENB; // 关闭c_cflag中的校验位使能标志PARENB)
m_Setting.c_iflag &= ~INPCK; // 关闭输入奇偶检测
break;
case 'o':
case 'O':
m_Setting.c_cflag |= (PARODD | PARENB);//激活c_cflag中的校验位使能标志PARENB,同时进行奇校验
m_Setting.c_iflag |= INPCK; // 开启输入奇偶检测
break;
case 'e':
case 'E':
m_Setting.c_cflag |= PARENB;//激活c_cflag中的校验位使能标志PARENB
m_Setting.c_cflag &= ~PARODD;// 使用偶校验
m_Setting.c_iflag |= INPCK;// 开启输入奇偶检测
break;
case 's':
case 'S':
m_Setting.c_cflag &= ~PARENB; // 关闭c_cflag中的校验位使能标志PARENB)
m_Setting.c_cflag &= ~CSTOPB; // 设置停止位位一位
break;
default:
fprintf(stderr,"unsupported parityBit\n");
return false;
}
m_Setting.c_oflag &= ~OPOST;// 设置为原始输出模式
m_Setting.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG); // 设置为原始输入模式
m_Setting.c_cc[VTIME] = 1;
m_Setting.c_cc[VMIN] = 1;
m_Setting.c_iflag &= ~(BRKINT | ICRNL | INPCK | ISTRIP | IXON);
tcflush(fd, TCIFLUSH);
// 激活配置
if( 0 != tcsetattr(fd,TCSANOW,&m_Setting))
{
printf("InitSerialPort tecsetattr() %d failed\n",__LINE__);
return false;
}
return true;
}