如何在数据流中找出需要的包
假设定义好了数据包:FE(开始符)+FF(报文长度)+AA(标志位)+BB(数据)+CC(校验位)+FF(结束符)
原理:找到每个FE,判断这个FE后面的报文长度、校验、结束符是否正确,如果正确就把这个包提取出来
Qt代码:
uchar ba_1_lenth=0;
int position_FE=0;
while(true)
{
position_FE = ba.indexOf(0xFE,position_FE);//找到第一个FE的位置
if(-1==position_FE)//如果没有找到则返回
{
break;
}
if(ba.size()==(position_FE+1))//防止下面“at(position_FE+1)”越界
{
break;
}
if((uchar)ba.at(position_FE+1)>(ba.size()-position_FE))//如果报文中的帧长度大于实际接收长度,说明长度不够或者此FE不是开始符
{
position_FE++;//返回找判断下一个FE
continue;
}
/*如果长度足够*/
ba_1_lenth = (uchar)ba.at(position_FE+1);
if(0xFF==(uchar)ba.at(position_FE+ba_1_lenth-1))//结束符为0xFF
{
if((uint16_t)MyMethod::my_crc((uchar*)ba.data()+position_FE,ba_1_lenth-3) == uint16_t(((uchar)ba.at(position_FE+ba_1_lenth-3)<<8)+(uchar)ba.at(position_FE+ba_1_lenth-2)))//CRC正确
{
QByteArray ba2;
ba2 = ba.mid(position_FE,ba_1_lenth);
ba = ba.remove(0,position_FE+ba_1_lenth);
this->doAnalysis2(ba2);
}
else//CRC错误
{
position_FE++;//返回找判断下一个FE
continue;
}
}
else//结束符不是FF
{
position_FE++;//返回找判断下一个FE
continue;
}
}
长风破浪会有时,直挂云帆济沧海!
可通过下方链接找到博主
https://www.cnblogs.com/judes/p/10875138.html