#include "cserialportinterface.h" #include #include "readconfig.h" #include #include #include #include #include "languagemanager.h" //#pragma execution_character_set("utf-8") CSerialportInterface::CSerialportInterface():m_serialPort(NULL) { receiveArray.clear(); if(!m_serialPort) { m_serialPort = new QSerialPort(); connect(m_serialPort,&QSerialPort::readyRead,this,&CSerialportInterface::receiveDataInterface); connect(m_serialPort,&QSerialPort::errorOccurred,this,&CSerialportInterface::displayError); setConfigParam(); } m_blockTimer = new QTimer(); m_blockTimer->setInterval(1000); //connect(m_blockTimer,SIGNAL(timeout()),this,SLOT(slotHandleTimeout())); connect(m_blockTimer,&QTimer::timeout,this,[=] { qDebug()<<"Hello"; //串口都没有哪来的jiekou if(!m_serialPort->isOpen()) { setConfigParamSerialError(); qDebug()<<"串口重新打开失败"; } else { qDebug()<<"串口重新打开成功"; m_blockTimer->stop(); displayError(QSerialPort::NoError); } }); } CSerialportInterface::~CSerialportInterface() { if(m_serialPort) { delete m_serialPort; m_serialPort = NULL; } } //配置参数 bool CSerialportInterface::setConfigParam() { m_serialPort->close(); ST_SerialPortConfig st_SerialConfig; if(!ReadConfig::getInstance()->getSerialPortConfig(st_SerialConfig)) { QMessageBox::warning(NULL,tr("警告"),tr("获取串口配置失败"),QMessageBox::Retry); return false; } QSerialPortInfo m_SerialPortInfo; QStringList serialPortNames; #if 0 foreach(m_SerialPortInfo,QSerialPortInfo::availablePorts()) { QSerialPort serialport; serialport.setPort(m_SerialPortInfo); if(serialport.open(QIODevice::ReadWrite)) { serialPortNames.append(m_SerialPortInfo.portName()); serialport.close(); } } if(serialPortNames.isEmpty()) { QMessageBox::warning(NULL,tr("警告"),tr("无可用串口"),QMessageBox::Retry); return false; } #endif if(m_serialPort) { m_serialPort->setPortName(st_SerialConfig.portName); m_serialPort->setReadBufferSize(200); if(m_serialPort->open(QIODevice::ReadWrite)) { m_serialPort->setBaudRate(st_SerialConfig.baud); m_serialPort->setDataBits(QSerialPort::Data8); m_serialPort->setParity(QSerialPort::NoParity); m_serialPort->setStopBits(QSerialPort::OneStop); m_serialPort->setFlowControl(QSerialPort::NoFlowControl); } else { E_LANGUAGE language = LanguageManager::getInstance()->getCurrentLanguage(); if(language == Chinese_E) QMessageBox::warning(NULL,tr("警告"),tr("串口打开失败"),QMessageBox::Retry); else //if(language == English_E) QMessageBox::warning(NULL,tr("Warning"),tr("Failed to open the serial port"),QMessageBox::Retry); qDebug() <<"current language index:"<< language; //QMessageBox::warning(NULL,tr("警告"),tr("串口打开失败"),QMessageBox::Retry); return false; } } return true; } //发送数据接口 void CSerialportInterface::sendDataInterface(QByteArray sendArray) { if(m_serialPort) { if(m_serialPort->isOpen()) { m_serialPort->write(sendArray); // qDebug()<<"send"<readAll(); receiveArray.append(buf); while(!receiveArray.isEmpty()) { if(receiveArray[0] != (char)SLAVEPACKHEAD) { receiveArray.remove(0,1); } else { //获取有效数据长度 uint8_t datalen = 0; memcpy(&datalen,receiveArray.constData()+1,sizeof(uint8_t)); if(receiveArray.length() >= datalen + 4) { //校验成功 if((uint8_t)receiveArray[datalen+3] == SLAVEPACKTAIL) { emit signalReadyRead(receiveArray.mid(0,datalen + 4)); // qDebug()<start(); qDebug() <<"定时器开始运行"; setConfigParam(); } //解析数据 void CSerialportInterface::analysisProtocal(QByteArray) { } //配置参数 bool CSerialportInterface::setConfigParamSerialError() { m_serialPort->close(); ST_SerialPortConfig st_SerialConfig; if(!ReadConfig::getInstance()->getSerialPortConfig(st_SerialConfig)) { QMessageBox::warning(NULL,tr("警告"),tr("获取串口配置失败"),QMessageBox::Retry); return false; } QSerialPortInfo m_SerialPortInfo; QStringList serialPortNames; #if 0 foreach(m_SerialPortInfo,QSerialPortInfo::availablePorts()) { QSerialPort serialport; serialport.setPort(m_SerialPortInfo); if(serialport.open(QIODevice::ReadWrite)) { serialPortNames.append(m_SerialPortInfo.portName()); serialport.close(); } } if(serialPortNames.isEmpty()) { QMessageBox::warning(NULL,tr("警告"),tr("无可用串口"),QMessageBox::Retry); return false; } #endif if(m_serialPort) { m_serialPort->setPortName(st_SerialConfig.portName); m_serialPort->setReadBufferSize(200); if(m_serialPort->open(QIODevice::ReadWrite)) { m_serialPort->setBaudRate(st_SerialConfig.baud); m_serialPort->setDataBits(QSerialPort::Data8); m_serialPort->setParity(QSerialPort::NoParity); m_serialPort->setStopBits(QSerialPort::OneStop); m_serialPort->setFlowControl(QSerialPort::NoFlowControl); } /*else { QMessageBox::warning(NULL,tr("警告"),tr("串口打开失败"),QMessageBox::Retry); return false; }*/ } return true; }