关于单片机串口协议解析算法求指导

吾爱单片机 2017-08-02 10:22:36
有类似这么一些数据 会由GPRS模块 通过串口发给单片机

05 05 00 11 11 (包头:05 长度:05 命令:00 数据:11 校验 :11)

单片机在接收到的时候 会开一个缓冲区去存储数据,然后在主函数解析对应的数据,但是目前由于GPRS模块会出现粘包等情况,所以在解析的时候可能会出现丢包,数据解析不完整等情况! 请问有没有比较好的串口解析算法!!


中断内容
void USART1_IRQHandler(void)
{
if(USART_GetITStatus(USART1, USART_IT_RXNE) == SET)
{
USART_ClearITPendingBit(USART1, USART_IT_RXNE);

if(Serial1_Receive_Lenght<Serial1_Receive_MaxLenght)
{
if(Serial1_Receive_Lenght >Serial1_Receive_MaxLenght )
{
Serial1_Receive_Lenght = Serial1_Receive_MaxLenght + 1;
}
Serial1_Receive_Data[Serial1_Receive_Lenght++]=USART_ReceiveData(USART1);

}
Serial1_Receive_Time = 11;

}

}

主函数解析
void main()
{
if(1 ==Serial1_Receive_Time )
{

}
}
...全文
511 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
tianxj001 2017-08-12
  • 打赏
  • 举报
回复
包头:05 那处理就很简单,缓存区开大点,逐字搜索05关键字,按照协议匹配后续字节,符合协议的进行分块,然后就可以连续解析了。
small_person 2017-08-10
  • 打赏
  • 举报
回复
数据包协议格式这么明确,为什么不开一个大的缓存,循环接收,按照协议解析,有包头、有长度、有校验,即使粘包也不怕,除非是不完整的包,解析错误,数据指针移动到最新位置,等待下一个完整数据包。
j花落花开 2017-08-07
  • 打赏
  • 举报
回复
首先如六楼所说的,利用超时来分帧。这可以解决大部分情况。还有数据丢失之类的,需要一个合理的应用层协议,比如设帧头,帧尾,长度,校验码等。
of123 2017-08-03
  • 打赏
  • 举报
回复
引用 3 楼 fatalromeo 的回复:
长度如果有规律,就以长度来取,每到一个长度就取出来,算下校验。 另外,如果对数据实时传输没要求,是否可加上时间间隔,毕竟GPRS传输数据的时间没准的,粘包丢包都可能有。
从协议设置长度域来看,应该是支持可变长度的。
hello_mcu 2017-08-03
  • 打赏
  • 举报
回复
长度如果有规律,就以长度来取,每到一个长度就取出来,算下校验。 另外,如果对数据实时传输没要求,是否可加上时间间隔,毕竟GPRS传输数据的时间没准的,粘包丢包都可能有。
笨狗先飞 2017-08-03
  • 打赏
  • 举报
回复
合理设置通讯超时来截取数据包,一般一包数据和另一包数据之间的时间间隔会稍长,将超时时间设置在这个时间内,那就分开了。
of123 2017-08-03
  • 打赏
  • 举报
回复
这个协议似乎有缺陷,那就是 05 既可以作为起始标志,也可以作为实意数据。这样的话,如果出现了问题,你难以解析你收到的数据。除非你采用逐字节搜索 05 并根据随后包长校验一个包的数据并得到了符合协议定义的校验结果,才能假定你得到了正确的包。这里说假定,是因为可能有巧合的假包。毕竟,你的逐位异或校验太弱了。
worldy 2017-08-03
  • 打赏
  • 举报
回复
既然有长度数据,你就要以长度数据作为依据截取数据,这样即使连包,你也可以正确的解释
zgl7903 2017-08-02
  • 打赏
  • 举报
回复
最好多粘贴一些数据出来,比如N帧的,这样才好分析规律

21,597

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 驱动开发/核心开发
社区管理员
  • 驱动开发/核心开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧