至于有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 ----具有优先级的模式,并且还是先进后出的处理方式。
因为我这里的数据就是处理粘包的,不然分发下去又粘包了,采用先进后出的目的,怕部分数据包得不到及时处理(在一直发数据的情况下,有可能就是一直处理前几包数据,后面的数据就一直得不到处理,直到空闲时,才会处理后面的数据)。