소스 검색

change merge data

jiaolili 3 년 전
부모
커밋
e8fbacca0a
2개의 변경된 파일109개의 추가작업 그리고 60개의 파일을 삭제
  1. 108 60
      src/v2x/CommunicatePlatform/radio.cpp
  2. 1 0
      src/v2x/CommunicatePlatform/radio.h

+ 108 - 60
src/v2x/CommunicatePlatform/radio.cpp

@@ -397,74 +397,122 @@ int Radio::PackagetHeadInfo( unsigned char featureID,unsigned char commendID, un
 }
 void Radio::receiveData()
 {
+    QByteArray _ba;
+    _ba.clear();
+    _ba = m_serialPort_Radio->readAll();
+    m_data.append(_ba);
+    decodeData();
+
+//    if(m_iAppend==-1) {
+//        qint64 rLen = m_serialPort_Radio->bytesAvailable();
+
+//        if (rLen < 21) {
+//            return;
+//        }
+//        qDebug() << "rLen:"<<rLen;
+
+//        char first,second;
+//        QByteArray _ba;
+//        _ba.clear();
+//        _ba = m_serialPort_Radio->readAll();
+//        for(int i=0;i<_ba.size()-1;i++) {
+//            first = _ba[i];
+//            second = _ba[i+1];
+//            if ((first == '$')&&(second == '$')) {
+//                qDebug() << "find first two byte";
+//                if(i>0){
+//                    _ba.remove(0,i-1);
+//                }
+//                m_iAppend=0;
+//                m_data.append(_ba);
+//                break;
+//            }
+
+//        }
+
+
+//    } else if(m_iAppend==0) {
+//        qint64 rLen = m_serialPort_Radio->bytesAvailable();
+//        int dataLen=m_data.size();
+//        if (rLen < 50-dataLen) {
+//                return;
+//        }
+//        QByteArray _ba;
+//        QByteArray _tmp;
+//        char first,second;
+//        _tmp.clear();
+//        _ba.clear();
+//        _ba = m_serialPort_Radio->readAll();
+//        for(int i=0;i<_ba.size()-1;i++) {
+//            first = _ba[i];
+//            second = _ba[i+1];
+//            if ((first == '$')&&(second == '$')) {
+//                qDebug() << "find first two byte";
+//                if(i>0){
+//                    _tmp.append(_ba);
+//                    _ba.remove(i,(_ba.size()-1));
+//                    _tmp.remove(0,i-1);
+//                } else if(i==0) {
+//                    _tmp.append(_ba);
+//                    _ba.remove(i,(_ba.size()-1));
+//                }
+//                break;
+//            }
+
+//        }
+
+//        m_data.append(_ba);
+//        ReceiveDecode(m_data);
+//        replyMessage();
+//        m_iAppend=-1;
+//        m_data.clear();
+//    }
+}
+void Radio::decodeData()
+{
+    static int BATH_LENTH = 22;
+    if(m_data.size()>= BATH_LENTH) {
 
-
-    if(m_iAppend==-1) {
-        qint64 rLen = m_serialPort_Radio->bytesAvailable();
-
-        if (rLen < 21) {
+        // 防包太大
+        if (m_data.size() > 2048) {
+            qDebug() << "size too large";
             return;
         }
-        qDebug() << "rLen:"<<rLen;
-
-        char first,second;
-        QByteArray _ba;
-        _ba.clear();
-        _ba = m_serialPort_Radio->readAll();
-        for(int i=0;i<_ba.size()-1;i++) {
-            first = _ba[i];
-            second = _ba[i+1];
-            if ((first == '$')&&(second == '$')) {
-                qDebug() << "find first two byte";
-                if(i>0){
-                    _ba.remove(0,i-1);
+        //  ##
+        char first;
+        char second;
+        // 寻找报文开头
+        while (m_data.size() >= BATH_LENTH) {
+            while (1) {
+                first = m_data[0];
+                second = m_data[1];
+                if (first == '$' && second == '$') {
+                    break;
                 }
-                m_iAppend=0;
-                m_data.append(_ba);
-                break;
+                // 删除一个字符
+                m_data.remove(0, 1);
+                if (m_data.size() < BATH_LENTH)
+                    return;
             }
-
-        }
-
-
-    } else if(m_iAppend==0) {
-        qint64 rLen = m_serialPort_Radio->bytesAvailable();
-        int dataLen=m_data.size();
-        if (rLen < 50-dataLen) {
+            int high = m_data.at(16);
+            int low = m_data.at(17);
+            int dataLen = (high << 8) | low;
+            qDebug() << "dataLen:" << dataLen;
+            // 长度不对
+            if ((dataLen + sizeof(packageDataHead)) > m_data.size()) {
+                qDebug() << "message len error";
                 return;
-        }
-        QByteArray _ba;
-        QByteArray _tmp;
-        char first,second;
-        _tmp.clear();
-        _ba.clear();
-        _ba = m_serialPort_Radio->readAll();
-        for(int i=0;i<_ba.size()-1;i++) {
-            first = _ba[i];
-            second = _ba[i+1];
-            if ((first == '$')&&(second == '$')) {
-                qDebug() << "find first two byte";
-                if(i>0){
-                    _tmp.append(_ba);
-                    _ba.remove(i,(_ba.size()-1));
-                    _tmp.remove(0,i-1);
-                } else if(i==0) {
-                    _tmp.append(_ba);
-                    _ba.remove(i,(_ba.size()-1));
-                }
-                break;
             }
-
+            QByteArray temp = m_data.left(sizeof(packageDataHead) + dataLen + 1);
+            //queue_mutex.lock();
+            readData.enqueue(temp);
+            replyMessage();
+            //queue_mutex.unlock();
+            m_data.remove(0, sizeof(packageDataHead) + dataLen + 1);
         }
-
-        m_data.append(_ba);
-        ReceiveDecode(m_data);
-        replyMessage();
-        m_iAppend=-1;
-        m_data.clear();
     }
-}
 
+}
 char Radio::BCCEncode(char sbuf[],int len)//计算校验
 {
     if(sbuf == NULL || len < 4)
@@ -633,7 +681,7 @@ void Radio::responseCongestionIdentification(congestionIdentificationMessage con
 }
 void Radio::ReceiveDecode(QByteArray &data)
 {
-    static int BATH_LENTH = 21;
+    static int BATH_LENTH = 22;
     // 防包太大
     if (data.size() > 2048) {
         qDebug() << "size too large";
@@ -668,7 +716,7 @@ void Radio::ReceiveDecode(QByteArray &data)
         //queue_mutex.lock();
         readData.enqueue(temp);
         //queue_mutex.unlock();
-        data.remove(0, sizeof(packageDataHead) + dataLen + 1);//need check,20210915,jiaolili
+        data.remove(0, sizeof(packageDataHead) + dataLen + 1);
     }
 }
 

+ 1 - 0
src/v2x/CommunicatePlatform/radio.h

@@ -156,6 +156,7 @@ public:
     void setControlMemory(controlM m);
     void setGpsImuMemory(gpsImuM m);
     void sendResponseMessage(int type);
+    void decodeData();
 private:
     int m_iAppend;
     QSerialPort *m_serialPort_Radio;