STM32串口如何编写多包数据的解析程序,思路不是很清楚,希望大家提供个思路

2019-10-15 23:55发布

我现在做关于客户端下发数据,我通过串口接收后进行分析协议,提取数据,但是遇到多包数据的时候有个问题,比如这个数据包有3包,我应该是接收完第一包后,保存第一包数据的内容,给客户端应答数据,客户端收到应答后,给我下发第二包数据,我在解析第二包数据,拼接到第一包数据的后面,判断下是否到达最后一包,如果到达最后一包数据,这时在开始进行整个数据包的分析,思路我会,但是在程序中实现我还么有编程思路,请大家帮我出个主意或是思路
数据包的内容格式:标识位------------消息头(包含是否分包标志,数据长度内容,数据包来源(ID号),包选项(总包数。和当前是第几包数据))---------------消息体---------------校验位---------标识位;

问题:对于不分包的数据我已经完成解析工作了,就是按照数据内容,一步步的分析,完成整包数据校验---提取相应的 ID号------消息体内容-------根据消息内容执行功能。
但是对于多包数据,还是没有一个完整的可行的数据包分析方法,想在我这个单包数据分析程序中加几个标志位,判断数据包的是否完整的接收,没有到最后一包的时候就进行数据包拼接处理,等到都收完了,相关标志位置位,然后去整个分析数据包,这样是否可行,还是需要把我现有的单包分析数据架构重写,满足多包数据的接收和分析架构呢,

如果大家有什么好的架构或是思路能分享一下么,尽量说的详细一下,谢谢啦
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
3条回答
styleno1
1楼-- · 2019-10-16 05:03
根据协议来解析,不需要你做成万能的。
云烟浩淼
2楼-- · 2019-10-16 05:41
回复【2楼】styleno1:
---------------------------------
我也是这么想的,我现在的思路是这样的,不知道可以不可以:
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;
}
一般BDN
3楼-- · 2019-10-16 07:08
感觉可以参考简单的modbus

一周热门 更多>