单片机粘包处理---通俗易懂

至于有fifo的单片机,处理就没有那么麻烦,一个字节一个中断的处理,可以使用以下方式进行处理:

开辟一个二维数组,定义协议数据和非协议数据最大长度,以及最大缓存粘包条数。也就是二维数组的2个参数。

传输过程中,不处理粘包,在终端,设备端处理粘包,对于具有数据分发功能的路由设备,还是要处理粘包的。

有点SDN 与SD-WAN的意思,一个路由下面存在多个设备,这就会涉及到数据的分发,不会傻啦吧唧去广播的。

一个路由下面设备与设备之间通信,那就可以简单的认为是sdn了。

 数据长度达到最大值,仍然没有收到想要的数据,并且没有超时,取余操作,仍然接收。

如果是发一条协议数据,必须添加超时,不然必须等下一条数据上来才会上报上一条数据。

中断里不处理数据,接收完一条协议数据,就填充长度,主函数就根据长度,判断对应的二维数据是否有完整的数据,有数据,就先处理数据,然后长度清零。

开辟的缓存条数(接收时间,根据波特率计算最大接收时间),处理时间务必大于单片机处理这些缓存的时间。举个例子:

我开辟了8条,长度64字节的缓存(取中位数:32,实际根据自己的项目计算),我这里的波特率取9600,采用以下配置,一个字节10个bit,起始位1+数据位8+停止位1=10。

接收一个字节耗时约:1.042ms ,一共8*32*1.042=266.752ms,设计系统时主函数的扫描周期要小于266.752ms,不然,在粘包严重的情况下(连续粘8包,并且还连续发粘包数据,小概率事件,这样发数据的工程师,估计早已经被打死了),就会造成部分数据丢失。

主函数处理

不要问我为什么采用 if else if ----具有优先级的模式,并且还是先进后出的处理方式。

因为我这里的数据就是处理粘包的,不然分发下去又粘包了,采用先进后出的目的,怕部分数据包得不到及时处理(在一直发数据的情况下,有可能就是一直处理前几包数据,后面的数据就一直得不到处理,直到空闲时,才会处理后面的数据)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值