我们知道,串口的协议数据一般包括 帧头+地址+功能码+校验码+数据+帧尾 等组成。
请教一下,大家平时是怎么处理串口协议的呢,我用过的方法有两种,第三种方法听别人说过,但不知道具体是怎么样的实现思路。
第一种:超时判断,思路就是每在接收到串口数据,进入接收中断后,保存数据,并赋值一个变量,然后该变量的值在定时器里面自减,若自减到零说明对方数据传送完成,由此可判断接收完成,下一步就是在主程序里处理串口数据了。
这种办法现在基本不使用。
第二种:在接收中断里逐级判断,只有一级一级的数据判断正确,才进行接收,最后再判断校验码和帧尾,只有整个过程的数据都正确,才能确定数据接收完成,此时置位一个标志位,在主程序里处理通过此标志位执行相应程序。
现在我一直用的就是这种方法,但这种方法很容易有一种限制,就是只能一帧一帧的处理数据,就是说对方发了一帧数据后,下一帧数据要间隔一段时间(如10MS)再发送,如果两帧或以上的数据一起发送,第二种处理方法就会产生错误。
第三种:我也是听人说过,就是可以解决第二种只能一帧一帧接收数据的问题,具体的实现思路我也不清楚,只能分别简单描述一下,第三种方法也是我上来发帖请教的目的。
这种处理方法就是开辟一个相对较大的数组用于存放接收到的数据,接收程序只管接收数据,若接收到的数据到达数组尾端,下一个接收到的数据又会从数组头开始存放,即会把之前存放的数据覆盖掉。
在主程序里,不断扫描数组里面存放的数据,搜索里面的功能协议,每一条协议都要从数组里搜索一遍,每次循环都要这样做。我的疑问是怀疑自己理解错了,要是这样的话,单单搜索协议都要耗费大量的CPU时间,貌似不太现实。
请教一下各位大侠,是怎么处理多帧数据同时传输的问题的呢? |