251 lines
5.8 KiB
C++
251 lines
5.8 KiB
C++
//
|
||
// 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: "<<strName;
|
||
// 打开的文件名称;O_RDWR表示文件可读可写;非阻塞式;文件位终端设备;
|
||
fd = open(strName.c_str(), O_RDWR | O_NOCTTY | O_NDELAY);
|
||
LogInfo<<"fd value is: "<<fd;
|
||
|
||
if (fd < 0)
|
||
{
|
||
LogError<<"open device failure.";
|
||
return -1;
|
||
}
|
||
|
||
/* 测试该设备是否为tty设备 */
|
||
if (isatty(fd) == 0)
|
||
{
|
||
LogError<<"not tty device.";
|
||
return -1;
|
||
}
|
||
|
||
LogInfo<<"tty device is ok";
|
||
|
||
return fd;
|
||
}
|
||
|
||
//串口关闭
|
||
int32_t BaseComPort::ttyClose()
|
||
{
|
||
close(fd);
|
||
fd = -1;
|
||
return fd;
|
||
}
|
||
|
||
bool BaseComPort::bRuning()
|
||
{
|
||
return (fd >= 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<<fd<<":"<<chbuffer<<":"<<nRev;
|
||
return nRev;
|
||
}
|
||
|
||
//串口数据写入
|
||
int32_t BaseComPort::ttyWrite(char *buf, int32_t count)
|
||
{
|
||
int nRev = write(fd, buf, count);
|
||
|
||
return nRev;
|
||
}
|
||
|
||
int32_t BaseComPort::vGetBuffer(char *chOutBuff, int32_t nBufferSize)
|
||
{
|
||
chbuffer[sizeof(chbuffer) - 1] = 0x00;
|
||
int nBufferLength = strlen(chbuffer);
|
||
int nOutLength = nBufferLength < nBufferSize ? nBufferLength : nBufferSize;
|
||
memset(chOutBuff, 0x00, nBufferSize);
|
||
memcpy(chOutBuff, chbuffer, nOutLength);
|
||
|
||
return nOutLength;
|
||
}
|
||
|
||
int32_t BaseComPort::vGetMaxBufferSize()
|
||
{
|
||
return AEI_COMM_BUFFER_SIZE;
|
||
}
|