#include "Rasteranalysis.h" QRasterAnalysis::QRasterAnalysis(QObject *parent) : QObject(parent), m_tsk(true), _initdone(false) { this->requestData.clear(); analysisTsk = new QMyThread(this); analysisTsk->setUser(true); analysisTsk->loadfunc(this, &QRasterAnalysis::analysis_task); analysisTsk->start(); } QRasterAnalysis::~QRasterAnalysis() { if (analysisTsk) { if (analysisTsk->isRunning()) { m_tsk = false; analysisTsk->stop(); analysisTsk->quit(); analysisTsk->wait(); } } } /*初始化*/ void QRasterAnalysis::init(bool AutoEcho /*= false*/, bool LogData /*= false*/) { if (_initdone) { return; } _AutoEcho = AutoEcho; _LogData = LogData; _initdone = true; } /*数据打包和发送*/ void QRasterAnalysis::SendFrame(Raster_ComFrame m_ComFrame) { quint8 *pTxContent, *checksum; quint16 TxLen; quint16 crc_sum; if (!_initdone) { init(); } pTxContent = (quint8 *)malloc(BUFFLEN); TxLen = 0; pTxContent[TxLen++] = 0xCA; pTxContent[TxLen++] = 0x01; pTxContent[TxLen++] = m_ComFrame.cmd >> 8; pTxContent[TxLen++] = m_ComFrame.cmd & 0xFF; pTxContent[TxLen++] = m_ComFrame.len >> 8; pTxContent[TxLen++] = m_ComFrame.len & 0xFF; if (m_ComFrame.len) { memcpy(&pTxContent[TxLen], m_ComFrame.pData, m_ComFrame.len); TxLen += m_ComFrame.len; } crc_sum = Get_Crc8(&pTxContent[2], TxLen - 2); pTxContent[TxLen++] = crc_sum >> 8; pTxContent[TxLen++] = crc_sum & 0xFF; sendData2COM(TxLen, pTxContent);//进一步打包发送的数据 free(pTxContent); } /*把数据打包好以信号的形式发送出去*/ void QRasterAnalysis::sendData2COM(int size, quint8 *data) { QByteArray m_data; for (int i = 0; i < size; i++) { m_data.append(data[i]); } emit (pullData2COM(m_data));//把数据打包到信号里面发送出去 } /*数据接收槽函数*/ void QRasterAnalysis::recvDataByCOM(QByteArray data) { mMtLock.lock(); requestData.append(data); mMtLock.unlock(); } /*数据解析线程 在该类创建的时候就启动 用于解析接收到的数据*/ void QRasterAnalysis::analysis_task(void) { quint8 RxDataIndex; quint8 RxIndex = 0; quint16 RxTimeOut = 0; quint16 RxSum, CalSum; quint16 RxLen; quint8 *pRxContent; Raster_ComFrame m_RxFrame; pRxContent = (quint8 *)malloc(BUFFLEN); RxDataIndex = 0; RxIndex = 0; CalSum = 0; while (m_tsk) { if (RxTimeOut != 0) { RxTimeOut--; } else { //接收超时,重置本次接收 RxIndex = 0; RxDataIndex = 0; CalSum = 0; } quint8 recvdatatemp = 0; while (this->takeData(recvdatatemp, 1)) { RxTimeOut = RX_TIMEOUT; switch (RxIndex) { case RX_HEAD1: { if (recvdatatemp == 0xF4) { RxIndex++; RxDataIndex = 0; pRxContent[RxDataIndex++] = recvdatatemp; } } break; case RX_DEVICE: m_RxFrame.adr = recvdatatemp; RxIndex++; pRxContent[RxDataIndex++] = recvdatatemp; break; case RX_CMD: RxIndex++; pRxContent[RxDataIndex++] = recvdatatemp; m_RxFrame.cmd = recvdatatemp; break; //-----------------------以上为固定协议头部分------------------------ case RX_LEN1: { pRxContent[RxDataIndex++] = recvdatatemp; RxIndex++; m_RxFrame.len = recvdatatemp; if (m_RxFrame.len == 0)//当数据长度为0时,直接跳转至接收校验码 { RxIndex++; } else { RxLen = m_RxFrame.len; } } break; case RX_DATA: { pRxContent[RxDataIndex++] = recvdatatemp; if (!(--RxLen)) { RxIndex++; } } break; case RX_SUM1: { RxSum = recvdatatemp << 8; RxIndex++; } break; case RX_SUM2: { RxSum += recvdatatemp; CalSum = Get_Crc8(pRxContent, (m_RxFrame.len + CMDLEN_LEN)); if (RxSum == CalSum) { m_RxFrame.pData = pRxContent + CMDLEN_LEN;/*数据校验正确 将执行用户定义的解析函数*/ if (_analysiseupdateFun) _analysiseupdateFun(m_RxFrame); else { int a = 0; } RxTimeOut = 0;// RxIndex = 0; RxDataIndex = 0; } else { RxIndex = 0; RxDataIndex = 0; CalSum = 0; RxTimeOut = 0; } break; } default: { RxIndex = 0; RxDataIndex = 0; CalSum = 0; RxTimeOut = 0; } break; } } analysisTsk->msleep(10); } if (NULL != pRxContent){ free(pRxContent); pRxContent = NULL; } } /*队列中取出数据*/ bool QRasterAnalysis::takeData(quint8 &data, int nLen /*= 1*/) { mMtLock.lock(); bool bFlag = false; if (nLen <= getRxDataSize()) { QByteArray m_temp = requestData.left(nLen); char *temp = m_temp.data(); quint8 m_data = *temp; data = *temp; requestData.remove(0, nLen); bFlag = true; } mMtLock.unlock(); return bFlag; } /*获取接收fifo中的大小*/ int QRasterAnalysis::getRxDataSize(void) { return this->requestData.size(); } /*获取接收fifo中的数据*/ QByteArray QRasterAnalysis::getRxBufData(void) { return requestData; } /*清空fifo中的数据*/ bool QRasterAnalysis::cleanRxDataBuf(void) { requestData.clear(); return true; } /*CRC8校验 ptr:要校验的数组 len:数组长度 返回值:CRC8码*/ quint16 Get_Crc8(quint8 *ptr, quint16 len) { quint16 crc=0; quint16 sum=0; while (len--) { crc = crc + (*ptr++); } crc = (0xFFFF - crc); sum = crc >> 8; return (sum+(crc << 8)); }