OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 14033|回复: 3

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

[复制链接]

3

主题

6

帖子

0

精华

新手上路

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

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

如果大家有什么好的架构或是思路能分享一下么,尽量说的详细一下,谢谢啦

努力去解决工作中遇到的一个又一个问题
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

28

主题

1489

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1656
金钱
1656
注册时间
2013-7-24
在线时间
1 小时
发表于 2015-2-11 15:25:46 | 显示全部楼层
根据协议来解析,不需要你做成万能的。
于20150522停用该账号:http://www.microstar.club
回复

使用道具 举报

3

主题

6

帖子

0

精华

新手上路

积分
38
金钱
38
注册时间
2015-1-26
在线时间
0 小时
 楼主| 发表于 2015-2-13 13:52:43 | 显示全部楼层
回复【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] = '\0';
Count=0; Flag = 0;
 }
 break;
case 2:  //IC检测  $ICJC
  ICJC[RecRDSSDatalength++] = USART_ReceiveData(USART3);
 if(RecRDSSDatalength == ICJC[6])
 {
  ICJC[RecRDSSDatalength] = '\0';
Count=0; Flag = 0;
 }
 break;
case 3: //系统自检  $XTZJ
 XTZJ[RecRDSSDatalength++] = USART_ReceiveData(USART3);
 if(  RecRDSSDatalength == XTZJ[6])
 {
  XTZJ[RecRDSSDatalength] = '\0';
Count=0; Flag = 0;
 }
 break;
case 4:   //系统自检  $SJSC
 SJSC[RecRDSSDatalength++] = USART_ReceiveData(USART3);
 if(  RecRDSSDatalength == SJSC[6])
 {
  SJSC[RecRDSSDatalength] = '\0';
Count=0; Flag = 0;
 }
 break;
 default: ;
 break;
}
努力去解决工作中遇到的一个又一个问题
回复

使用道具 举报

56

主题

289

帖子

0

精华

高级会员

Rank: 4

积分
865
金钱
865
注册时间
2012-11-16
在线时间
65 小时
发表于 2016-12-19 21:43:58 | 显示全部楼层
感觉可以参考简单的modbus
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-5-26 08:40

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表