#include "serialequipment.h" SerialEquipment::SerialEquipment() { _isLog=false; this->_serialPort=new QSerialPort(); connect(this->_serialPort,SIGNAL(readyRead()),this,SLOT(dataReceive())); _mutex=new QMutex(QMutex::Recursive); } SerialEquipment::SerialEquipment(QString portName,QSerialPort::BaudRate baunRate,QSerialPort::DataBits dataBits,QSerialPort::Parity parity,QSerialPort::StopBits stopBits,int readBufferSize) { _isLog=false; this->setSerialInfo(portName,baunRate,dataBits,parity,stopBits,readBufferSize); this->_serialPort=new QSerialPort(); connect(this->_serialPort,SIGNAL(readyRead()),this,SLOT(dataReceive())); _mutex=new QMutex(QMutex::Recursive); } SerialEquipment::SerialEquipment(QString portName) { _isLog=false; this->setSerialInfo(portName,QSerialPort::Baud460800,QSerialPort::Data8,QSerialPort::NoParity,QSerialPort::OneStop,30); this->_serialPort=new QSerialPort(); connect(this->_serialPort,SIGNAL(readyRead()),this,SLOT(dataReceive())); _mutex=new QMutex(QMutex::Recursive); } SerialEquipment::SerialEquipment(QString portName, QSerialPort::BaudRate baunRate) { _isLog=false; this->setSerialInfo(portName,baunRate,QSerialPort::Data8,QSerialPort::NoParity,QSerialPort::OneStop,30); this->_serialPort=new QSerialPort(); connect(this->_serialPort,SIGNAL(readyRead()),this,SLOT(dataReceive())); _mutex=new QMutex(QMutex::Recursive); } SerialEquipment::~SerialEquipment() { closePort(); delete this->_serialPort; } void SerialEquipment::setSerialInfo(QString portName, QSerialPort::BaudRate baunRate, QSerialPort::DataBits dataBits, QSerialPort::Parity parity, QSerialPort::StopBits stopBits, int readBufferSize) { _isLog=false; this->_strPortName=portName; this->_iBaudRate=baunRate; this->_iDataBits=dataBits; this->_iParity=parity; this->_iStopBits=stopBits; this->_iReadBufferSize=readBufferSize; this->needWait=true; } void SerialEquipment::setSerialInfo(QString portName, QSerialPort::BaudRate baunRate) { setSerialInfo(portName,baunRate,QSerialPort::Data8,QSerialPort::NoParity,QSerialPort::OneStop,512); } bool SerialEquipment::getPortState() { if(this->_serialPort==nullptr) { return false; } else { if(this->_serialPort->isOpen()) { return true ; } else { return false; } } } bool SerialEquipment::openPort() { _isLog=false; testJDCount=0; testTotalCount=0; bTestDebug=false; if(this->_serialPort==nullptr) { return false; } else { if(!this->_serialPort->isOpen()) { this->_serialPort->setPortName(this->_strPortName); this->_serialPort->setBaudRate(this->_iBaudRate); this->_serialPort->setParity(this->_iParity); this->_serialPort->setStopBits(this->_iStopBits); this->_serialPort->setDataBits(this->_iDataBits); this->_serialPort->setFlowControl(QSerialPort::NoFlowControl); this->_serialPort->setReadBufferSize(512); bool bresult=this->_serialPort->open(QIODevice::ReadWrite); return bresult; } else { return false; } } } bool SerialEquipment::closePort() { if(this->_serialPort==nullptr) { return false; } else { if(this->_serialPort->isOpen()) { this->_serialPort->close(); return true; } else { return false; } } } void SerialEquipment::dataReceive() { QByteArray revBuffer; int iHeadLength=this->_frameHead.length(); int iTailLength=this->_frameTail.length(); while(this->_serialPort->bytesAvailable()>0) { revBuffer.clear(); revBuffer=this->_serialPort->readAll(); //this->testTotalCount+=revBuffer.count(); // if(bTestDebug) // { //qDebug()<<"rev All: "<<tool::ByteArray2HEXQString(revBuffer); // } // emit onDataReceived(&revBuffer); if(iHeadLength==0||iTailLength==0) { return; } int iLen=revBuffer.length(); if(_isLog) { _logInfo->iRevTotalByte+=iLen; } int iCount=0; while(iCount<iLen) { //qDebug()<<"tempArrayCount"<<_tempArray.count(); if(_tempArray.length()==iHeadLength) { if(!tool::checkArraySame(this->_frameHead,_tempArray,iHeadLength-1,0)) { _tempArray.remove(0,1); } } _tempArray.append(revBuffer.data()[iCount]); if(_tempArray.length()==iHeadLength+1) { this->_iFrameSize= static_cast<uint8_t>(revBuffer.data()[iCount])+iHeadLength+iTailLength+2; if(this->_iFrameSize>30){ qDebug()<<"lastBag:"<<tool::ByteArray2HEXQString(_tempArray); _tempArray.clear(); continue; } //qDebug()<<"_iFrameSize"<<this->_iFrameSize; } iCount++; if(_tempArray.length()==this->_iFrameSize) { if(this->_iFrameSize>30){ qDebug()<<"lastBag:"<<tool::ByteArray2HEXQString(_tempArray); } QByteArray frameArray=_tempArray; // if(bTestDebug) // { // if(frameArray.at(2)==static_cast<char>(0x94)){ // qDebug()<<QString::number(this->_iFrameSize)+"wait check: "<<tool::ByteArray2HEXQString(frameArray); // } // } if(tool::checkArraySame(frameArray,_frameTail,frameArray.length()-iTailLength,frameArray.length()-1) && checkData(frameArray,iTailLength)) { // if(bTestDebug) // { // qDebug()<<"check:true "; // } emit this->onFrameReceived(&frameArray); // if(frameArray[2]!= 0x94) // { // testJDCount++; // } dealDate(frameArray); if(_isLog) { _logInfo->iGoodFrameCount++; _logInfo->iRevGoodByte+=frameArray.count(); if(static_cast<uint8_t>(frameArray.data()[2])==0x8F||static_cast<uint8_t>(frameArray.data()[2])==0x9F) { _logInfo->iSendNGFrameCount++; } } _tempArray.clear(); } else { qDebug()<<"count:"+QString::number(iCount)+"--error--"<<tool::ByteArray2HEXQString(_tempArray); if(_isLog) { _logInfo->iCheckNGFrameCount++; } //_tempArray=adjustList(_tempArray); _tempArray.clear(); // //iCount-=_tempArray.count(); // if(iCount<0){ // iCount=0; // } //qDebug()<<"count:"+QString::number(iCount)+"--back--"<<tool::ByteArray2HEXQString(_tempArray); //_tempArray.clear(); } } } } revBuffer.clear(); } bool SerialEquipment::checkData(QByteArray buffer, int iTailIndex) { return DataCheck::sumCheck(buffer,iTailIndex); } void SerialEquipment::dataReceive1() { QByteArray revBuffer; int iHeadLength=this->_frameHead.length(); while(this->_serialPort->bytesAvailable()>0) { revBuffer.clear(); revBuffer=this->_serialPort->readAll(); int iLen=revBuffer.length(); int iCount=0; while(iCount<iLen) { if(_tempArray.length()==iHeadLength) { if(!tool::checkArraySame(this->_frameHead,_tempArray,iHeadLength-1,0)) { _tempArray.remove(0,1); } } _tempArray.append(revBuffer.data()[iCount]); iCount++; if(_tempArray.length()==this->_iFrameSize) { QByteArray frameArray=_tempArray; if(DataCheck::sumCheck(frameArray)) { emit this->onFrameReceived(&frameArray); _tempArray.clear(); } else { _tempArray=adjustList(_tempArray); } } } } revBuffer.clear(); } void SerialEquipment::dealDate(QByteArray) { } SerialLogInfo *SerialEquipment::GetLogInfo() { return _logInfo; } void SerialEquipment::delayMsec(int mesc) { QTime temp=QTime::currentTime().addMSecs(mesc); while(QTime::currentTime()<temp) { QCoreApplication::processEvents(QEventLoop::AllEvents,100); } } QList<QString> SerialEquipment::getAllPorts() { QList<QString> resultList; QList<QSerialPortInfo> portList = QSerialPortInfo::availablePorts(); for (int i=0;i<portList.count();i++) { resultList.append(portList[i].portName()); } return resultList; } void SerialEquipment::setNeedWait(bool value) { needWait = value; } QList<char> SerialEquipment::adjustList(QList<char> srcList) { if(srcList.length()>0) { srcList.removeAt(0); } else { return srcList; } return tool::findHead(srcList,this->_frameHead); } QByteArray SerialEquipment::adjustList(QByteArray srcList) { if(srcList.length()>0) { srcList.remove(0,1); } else { return srcList; } return tool::findHead(srcList,this->_frameHead); } bool SerialEquipment::sendMsg(QByteArray sendBuffer) { if(this->getPortState()) { _mutex->lock(); this->_serialPort->write(sendBuffer); if(needWait){ qDebug()<<"wait"; if(!this->_serialPort->waitForBytesWritten()){ _mutex->unlock(); return false; } } _mutex->unlock(); emit onFrameSended(&sendBuffer); // if(sendBuffer.count()>3&&static_cast<u_int8_t>(sendBuffer[2])!=static_cast<u_int8_t>(0x81)&&static_cast<u_int8_t>(sendBuffer[2])!=static_cast<u_int8_t>(0x99)){ // QString tempString = tool::ByteArray2HEXQString(sendBuffer); // qDebug()<<"send: "<<tempString; // } // if(static_cast<u_int8_t>(sendBuffer[2])==static_cast<u_int8_t>(0x85)) // { // QString tempString = tool::ByteArray2HEXQString(sendBuffer); // qDebug()<<"sendDI_A: "<<tempString; // } // if(static_cast<u_int8_t>(sendBuffer[2])==static_cast<u_int8_t>(0x93)) // { // QString tempString = tool::ByteArray2HEXQString(sendBuffer); // qDebug()<<tempString; // } return true; } else { return false; } } void SerialEquipment::setLogInfo(bool isLog) { isLog=false; if(isLog) { _logInfo=new SerialLogInfo(); _logInfo->iCheckNGFrameCount=0; _logInfo->iGoodFrameCount=0; _logInfo->iRevGoodByte=0; _logInfo->iRevTotalByte=0; _logInfo->iSendNGFrameCount=0; _logInfo->iSendFrameCount=0; } _isLog=isLog; } bool SerialEquipment::sendMsg(QString strMessage) { if(this->getPortState()) { QByteArray sendBuffer=strMessage.toLatin1(); _mutex->lock(); this->_serialPort->write(sendBuffer); if(needWait){ //qDebug()<<"wait"; if(!this->_serialPort->waitForBytesWritten()){ _mutex->unlock(); return false; } } _mutex->unlock(); emit onFrameSended(&sendBuffer); if(_isLog) { _logInfo->iSendFrameCount++; } qDebug()<<"send: "<<strMessage; return true; } else { return false; } } void SerialEquipment::setFrameHead(QByteArray frameHead) { this->_frameHead=frameHead; } void SerialEquipment::setFrameTail(QByteArray frameTail) { this->_frameTail=frameTail; } void SerialEquipment::setFrameSize(int iFramSize) { this->_iFrameSize=iFramSize; }