|
@@ -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);
|
|
|
}
|
|
|
}
|
|
|
|