// // Created by matrixai on 3/26/24. // #include "BaseComPort.h" //构造函数 //输入参数:无 //输出参数:无 //返回值:无 BaseComPort::BaseComPort() { memset(chbuffer, 0x00, sizeof(AEI_COMM_BUFFER_SIZE)); m_map_parity = { {"n",0}, {"N",1}, {"o",2}, {"O",3}, {"e",4}, {"E",5}, {"s",6}, {"S",7} }; } //析构函数 //输入参数:无 //输出参数:无 //返回值:无 BaseComPort::~BaseComPort() { ttyClose(); } //串口打开 int32_t BaseComPort::ttyOpen(std::string strName) { LogInfo<<"m_serial_data.name.c_str() is: "<= 0); } //属性参数设置 int32_t BaseComPort::ttySetBaud(int nbaud, int ndatabits, std::string strparitybits, int nstopbits) { int32_t ret = 0; bzero(&ntm, sizeof(ntm)); //将自己的前n个数清0 //获取终端的控制参数,成功return 0; if(tcgetattr(fd,&ntm) != 0) { LogError<<"setup serial failure."; return -1; } // ntm.c_cflag = CS8 | CLOCAL | CREAD; //收发采用8位数据位;忽略所有调制解调器的状态行;启动字符接收器 ntm.c_cflag &= ~CSIZE; //清楚数据位掩码 switch(nbaud) { case 300: //ntm.c_cflag |= B300; cfsetispeed(&ntm, B300); cfsetospeed(&ntm, B300); break; case 1200: cfsetispeed(&ntm, B1200); cfsetospeed(&ntm, B1200); break; case 2400: cfsetispeed(&ntm, B2400); cfsetospeed(&ntm, B2400); break; case 4800: cfsetispeed(&ntm, B4800); cfsetospeed(&ntm, B4800); break; case 9600: cfsetispeed(&ntm, B9600); cfsetospeed(&ntm, B9600); break; case 19200: cfsetispeed(&ntm, B19200); cfsetospeed(&ntm, B19200); break; case 38400: cfsetispeed(&ntm, B38400); cfsetospeed(&ntm, B38400); break; case 115200: cfsetispeed(&ntm, B115200); cfsetospeed(&ntm, B115200); break; default: LogError<<"the value of m_serial_data.baud is error, please check."; ret = -1; break; } //设置数据位数 switch (ndatabits) { case 5: ntm.c_cflag |= CS5; break; case 6: ntm.c_cflag |= CS6; break; case 7: ntm.c_cflag |= CS7; break; case 8: ntm.c_cflag |= CS8; break; default: LogError<<"the data_bits in config.yaml is error, please check."; return -1; break; } // 设置奇偶校验位数 int32_t parity = -1; auto findResult = m_map_parity.find(strparitybits); if(findResult != m_map_parity.end()) { parity = m_map_parity[strparitybits]; } switch (parity) { case 0: case 1: ntm.c_cflag &= ~PARENB; ntm.c_iflag &= ~INPCK; break; case 2: case 3: ntm.c_cflag |= (PARODD|PARENB); ntm.c_iflag |= INPCK; break; case 4: case 5: ntm.c_cflag |= PARENB; ntm.c_cflag &= ~PARODD; ntm.c_iflag |= INPCK; break; case 6: case 7: ntm.c_cflag &= ~PARENB; ntm.c_cflag &= ~CSTOPB; break; default: LogError<<"the parity_bits in config.yaml is error, please check."; return -1; break; } // 设置停止位 switch (nstopbits) { case 1: ntm.c_cflag &= ~CSTOPB; break; case 2: ntm.c_cflag |= CSTOPB; break; default: LogError<<"the stop_bits in config.yaml is error, please check."; return -1; break; } //ntm.c_lflag = 0; ntm.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG); ntm.c_cc[VTIME] = 10; //设置超时时间10s ntm.c_cc[VMIN] = 1; //至少读取1个字节的数据,或者设为0 tcflush(fd, TCIFLUSH); //清空终端未完成的输入/输出请求及数据 //设置终端控制参数,TCSANOW立刻生效 if (tcsetattr(fd,TCSANOW,&ntm) != 0) { LogError<<"setup serial failure"; return -1; } return ret; } //串口数据读取 int32_t BaseComPort::ttyRead() { memset(chbuffer, 0x00, sizeof(chbuffer)); int nRev = read(fd, chbuffer, (sizeof(chbuffer) - 1)); //LogInfo<