QT串口递归解析最新数据包数据
直接看代码:
//函数功能:对实时接收到的串口数据进行解析处理,根据制定的协议格式处理
//参数1:实时收到的数据,
//参数2:解析后的结果
//返回值:如果为true,说明解析成功,false 说明解析失败。
bool CheckFormatFun(QByteArray arr,QByteArray &resultdata)
{
if(!arr.isEmpty())
{
m_RecvData.append(arr);
if(m_RecvData.length() < _DATA_SIZE)
{
return false;
}
for(int i = 0; i < m_RecvData.length(); i++)
{
if(m_RecvData.length() - i < _DATA_SIZE)
{
m_RecvData.remove(0,i);
return false;
}
if(0xBD == (UCHAR)m_RecvData[i] && 0x43 == (UCHAR)m_RecvData[i+1] && 0xF8 == (UCHAR)m_RecvData[i+2] && 0x0D == (UCHAR)m_RecvData[i+65] && 0x0A == (UCHAR)m_RecvData[i+66])
{
uint16_t crc = QHelperData::MCLXB_CRC((UCHAR*)&m_RecvData.data()[i],_DATA_SIZE-4); //CRC校验
if (crc == (UINT_16)(m_RecvData[i+_DATA_CRC_SIZE] << 8) + (UCHAR)m_RecvData[i+_DATA_CRC_SIZE+1]) //大端传输数据,判断校验值是否正确
{
m_RecvData.remove(0,i);
resultdata.clear();
resultdata.append(m_RecvData.left(_DATA_SIZE));
m_RecvData.remove(0,_DATA_SIZE);
if(m_RecvData.length() > _DATA_SIZE)
{
return CheckFormatFun(m_RecvData,resultdata); //递归获取最新的数据协议包数据
}
else
{
return true;
}
}
}
}
}
return false;
}
此代码为某对象成员函数,在用的时候可以将此函数放到某个对象里面进行调试。
下面附上CRC校验代码:
//函数功能:计算CRC16
//参数1:*data 16位CRC校验数据,
//参数2:len 数据流长度
uint16_t MCLXB_CRC(uint8_t *data, uint32_t len)
{
unsigned char i, *ptr = data;
unsigned int crc = 0;
uint16_t crc_result = 0;
uint32_t index;
index = len;
while (index--)
{
for (i = 0x80; i != 0; i = i >> 1)
{
if ((crc & 0x8000) != 0)
{
crc = crc << 1;
crc = crc ^ 0x1021;
}
else
{
crc = crc << 1;
}
if ((*ptr & i) != 0)
{
crc = crc ^ 0x1021;
}
}
ptr++;
}
crc_result = crc;
return crc_result;
}