#include "PhaseProtocolBM.h" PhaseProtocolBM::PhaseProtocolBM(QObject *parent) : QObject(parent) { } PhaseProtocolBM::~PhaseProtocolBM() { } bool PhaseProtocolBM::parseMessureData(QByteArray rawData, PhaseDataDto * dataObj) { // 获取帧头——帧计数 QByteArray head = rawData.left(PHASE_FRAME_ID_LENGTH); dataObj->frameId = QByteUtil::binToHexString(head); int j = 0; // 用于转换通道顺序 // 获取每个通道的测量数据 for (int i = 1; i <= PHASE_MESSURE_CHANNEL; i++) { if (i <= 8) { j = 2 * i - 1; } else { j = 2 * (i - 8); } QByteArray channelRaw = rawData.left(PHASE_MESSURE_SIZE * j + PHASE_FRAME_ID_LENGTH).right(PHASE_MESSURE_SIZE); qulonglong channelRawData = QByteUtil::binToULong(channelRaw, 8); if (channelRawData == CALCULATE_OFFSET) { dataObj->channelActive.append("0"); // dataObj->rawPhaseDiffData.append(0); dataObj->channelData.append(0.00); // dataObj->channelDataStr.append("0.00"); } else if (channelRawData > CALCULATE_OFFSET) { double phase = (channelRawData - CALCULATE_OFFSET) * CALCULATE_FACTOR; dataObj->channelActive.append("1"); // dataObj->rawPhaseDiffData.append(channelRawData - CALCULATE_OFFSET); dataObj->channelData.append(phase); // 暂时不加补偿值,界面显示时再计算补偿后的值 // dataObj->channelDataStr.append(QString::number(phase, 'f', 15)); } else { double phase = -1.0 * (CALCULATE_OFFSET - channelRawData) * CALCULATE_FACTOR; // rawData是无符号long 相位有正有负 小于CALCULATE_OFFSET时是负值 dataObj->channelActive.append("1"); // dataObj->rawPhaseDiffData.append(channelRawData - CALCULATE_OFFSET); dataObj->channelData.append(phase); // 暂时不加补偿值,界面显示时再计算补偿后的值 // dataObj->channelDataStr.append(QString::number(phase, 'f', 15)); } } return true; } QString PhaseProtocolBM::startMessure() { return "$START*"; } QString PhaseProtocolBM::stopMessure() { return "$$STOP*"; } QList<QByteArray> PhaseProtocolBM::extractFrameList(QByteArray rawData) { QList<QByteArray> resultList; if (rawData.size() < PHASE_FRAM_LENGTH) { // 长度小于帧长度则直接返回空 return resultList; } int tail = rawData.indexOf(PHASE_FRAME_TAIL); if (tail < PHASE_FRAM_LENGTH - PHASE_FRAME_TAIL.size()) { // 没有检测到帧尾EEEEEEEE或者帧尾前的长度不够则直接返回空 return resultList; } while (rawData.size() > 0) { QByteArray ba; ba.append(rawData.mid(tail - PHASE_FRAM_LENGTH + PHASE_FRAME_TAIL.size(), PHASE_FRAM_LENGTH)); resultList.append(ba); rawData = rawData.right(tail + PHASE_FRAME_TAIL.size()); } return resultList; } bool PhaseProtocolBM::checkFrame(QByteArray rawData) { // 帧长度小于最小的长度 if (rawData.length() != PHASE_FRAM_LENGTH) { return false; } // 帧尾不是0xEEEEEEEE if (rawData.mid(rawData.length() - PHASE_FRAME_TAIL.size()) != PHASE_FRAME_TAIL) { return false; } return true; }