我现在做关于客户端下发数据,我通过串口接收后进行分析协议,提取数据,但是遇到多包数据的时候有个问题,比如这个数据包有3包,我应该是接收完第一包后,保存第一包数据的内容,给客户端应答数据,客户端收到应答后,给我下发第二包数据,我在解析第二包数据,拼接到第一包数据的后面,判断下是否到达最后一包,如果到达最后一包数据,这时在开始进行整个数据包的分析,思路我会,但是在程序中实现我还么有编程思路,请大家帮我出个主意或是思路
数据包的内容格式:标识位------------消息头(包含是否分包标志,数据长度内容,数据包来源(ID号),包选项(总包数。和当前是第几包数据))---------------消息体---------------校验位---------标识位;
问题:对于不分包的数据我已经完成解析工作了,就是按照数据内容,一步步的分析,完成整包数据校验---提取相应的 ID号------消息体内容-------根据消息内容执行功能。
但是对于多包数据,还是没有一个完整的可行的数据包分析方法,想在我这个单包数据分析程序中加几个标志位,判断数据包的是否完整的接收,没有到最后一包的时候就进行数据包拼接处理,等到都收完了,相关标志位置位,然后去整个分析数据包,这样是否可行,还是需要把我现有的单包分析数据架构重写,满足多包数据的接收和分析架构呢,
如果大家有什么好的架构或是思路能分享一下么,尽量说的详细一下,谢谢啦
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
---------------------------------
我也是这么想的,我现在的思路是这样的,不知道可以不可以:
if(USART_GetITStatus(USART3,USART_IT_RXNE)!=RESET)
{
USART_ClearFlag(USART3,USART_FLAG_RXNE);
USART_ClearITPendingBit(USART3, USART_IT_RXNE);
//接收数据
RdssData[2] = USART_ReceiveData(USART3);
RdssData[0] = RdssData[1];
RdssData[1] = RdssData[2];
if(Flag==0)
{
if((RdssData[0]=='$')&&(RdssData[1]=='T')) //通信申请 $TXSQ
{
Count = 1; Flag = 1;
RecRDSS_Data[RecRDSSDatalength++] = '$';
}
else if((RdssData[0]=='$')&&(RdssData[1]=='I')) //IC检测 $ICJC
{
Count = 2; Flag = 1;
ICJC[RecRDSSDatalength++] = '$';
}
else if((RdssData[0]=='$')&&(RdssData[1]=='Z')) //系统自检 $XTZJ
{
Count = 3; Flag = 1;
XTZJ[RecRDSSDatalength++] = '$';
}
else if((RdssData[0]=='$')&&(RdssData[1]=='S')) //系统自检 $SJSC
{
Count = 4; Flag = 1;
SJSC[RecRDSSDatalength++] = '$';
}
}
switch(Count)
{
case 1: //通信申请 $TXSQ
RecRDSS_Data[RecRDSSDatalength++] = USART_ReceiveData(USART3);
if(RecRDSS_Data[6] == RecRDSSDatalength)
{
RecRDSS_Data[RecRDSSDatalength] = ' ';
Count=0; Flag = 0;
}
break;
case 2: //IC检测 $ICJC
ICJC[RecRDSSDatalength++] = USART_ReceiveData(USART3);
if(RecRDSSDatalength == ICJC[6])
{
ICJC[RecRDSSDatalength] = ' ';
Count=0; Flag = 0;
}
break;
case 3: //系统自检 $XTZJ
XTZJ[RecRDSSDatalength++] = USART_ReceiveData(USART3);
if( RecRDSSDatalength == XTZJ[6])
{
XTZJ[RecRDSSDatalength] = ' ';
Count=0; Flag = 0;
}
break;
case 4: //系统自检 $SJSC
SJSC[RecRDSSDatalength++] = USART_ReceiveData(USART3);
if( RecRDSSDatalength == SJSC[6])
{
SJSC[RecRDSSDatalength] = ' ';
Count=0; Flag = 0;
}
break;
default: ;
break;
}
一周热门 更多>