#include "CCtrlNikiraPMA.h" #include CtrlNikiraPMA::CtrlNikiraPMA() { m_iBaudRate = 115200; m_pSerialPort = new QSerialPort; } CtrlNikiraPMA::~CtrlNikiraPMA() { delete m_pSerialPort; } double CtrlNikiraPMA::ConvertDateToEpoch(const QString& qstrDateTime) { QDateTime dateTime = QDateTime::fromString(qstrDateTime, "yyyyMMdd-hh:mm:ss.zzz"); if (!dateTime.isValid()) { throw std::invalid_argument("Invalid date format"); } return dateTime.toMSecsSinceEpoch() / 1000.0; } QVector CtrlNikiraPMA::ParseData(const QString& qstrData) { return QVector(); } QString CtrlNikiraPMA::FindCompleteFrame() { int firstValidCharPos = -1; for (int i = 0; i < m_qbRecv.size(); ++i) { if (m_qbRecv[i] != '\x00' && m_qbRecv[i] != '\r') { firstValidCharPos = i; break; } } if (firstValidCharPos == -1) { return QString(); } QByteArray validData = m_qbRecv.mid(firstValidCharPos); int endPos = validData.lastIndexOf("OK\r"); if (endPos == -1) { return QString(); } // 查找时间戳开头,确保是从时间戳开始到 OK\r 结束 QRegularExpression timeStampRegex(R"(\d{8}-\d{2}:\d{2}:\d{2}\.\d{3})"); QRegularExpressionMatch match = timeStampRegex.match(QString::fromLatin1(validData)); int startPos = match.capturedStart(); if (!match.hasMatch() || startPos >= endPos) { return QString(); } QString completeFrame = QString::fromLatin1(validData.mid(startPos, endPos - startPos + 3)); m_qbRecv.remove(0, firstValidCharPos + endPos + 3); //qDebug() << m_qbRecv; //qDebug() << completeFrame; return completeFrame; ////QRegularExpression frameRegex(R"((\d{8}-\d{2}:\d{2}:\d{2}\.\d{3},(-?\d+(\.\d+)?)(,-?\d+(\.\d+)?)*,OK\r))"); //QRegularExpression frameRegex("(\\d{8}-\\d{2}:\\d{2}:\\d{2}\\.\\d{3}.*?OK)"); //qDebug() << m_qbRecv; //QRegularExpressionMatch match = frameRegex.match(QString::fromUtf8(m_qbRecv)); //if (match.hasMatch()) //{ // QString completeFrame = match.captured(1); // m_qbRecv.remove(0, match.capturedEnd(1)); // //qDebug() << "Removed"<< m_qbRecv <setPortName(qstrPortName); m_pSerialPort->setReadBufferSize(512); bool bRes = m_pSerialPort->setBaudRate(m_iBaudRate); if (!bRes) { qDebug() << "Err:setBaudRate Failed.Exit Code:1"; return 1; } bRes = m_pSerialPort->open(QIODevice::ReadWrite); if (!bRes) { qDebug() << "nikira,Err:open Failed.Exit Code:2"; return 2; } m_qbRecv.clear(); return 0; } QString CtrlNikiraPMA::GetLastValidDataFrame(double& dCH4, double& dH2O) { m_qbRecv.clear(); int iFlag = 1; //qDebug() << "enter GetLastValidDataFrame"; while (iFlag) { //qDebug() << "enter GetLastValidDataFrame while"; m_pSerialPort->waitForReadyRead(1000); QByteArray data = m_pSerialPort->readAll(); m_qbRecv.append(data); //qDebug() <<"Append:" << m_qbRecv << endl; QString qstrFrame = FindCompleteFrame(); if (!qstrFrame.isEmpty()) { //if (qstrFrame.endsWith("OK\\r")) //{ QStringList values = qstrFrame.split(','); if (values.size() >= 5) { QString methane = values[2]; QString waterVapor = values[3]; dCH4 = methane.toDouble(); dH2O = waterVapor.toDouble(); iFlag = 0; } //qDebug() <<"FULL:" << qstrFrame << endl; return qstrFrame; //} } } return 0; }