应对多串口定频被动接收

                                           多串口协议下定频接收(MCU裸机或RTOS均可)

      首先串口通讯波特率与数据传输时间的关系,以GPS解析为例,正常工作时,GPS工作以波特率921600,8个数据位,一个起始位,一个停止位。921600bps/(8+1+1)bit=传输92160字节/s,故串口传输一个字节用时1000000us/92160≈10.85us,这里可以简单计算一下,主机假设接受pvt语句开销92数据位+2检验位=94,94*10.85约等于1.02ms,与主机实际测试时间基本一致,实际也可以测试115200、38400通讯时开销分别为8.53ms、25.6ms,接受单个字节耗时分别为86.8us、264.4us。 以GPS解析为说明串口传输时间后,再来考虑中断问题,首先为保障数据不丢帧不覆盖,当只存在一个串口中断时,该串口中断内部函数执行时间,务必要小于该串口的传输一个字节所需的时间,以波特率115200的串口为例,串口的中断函数执行时间务必小于86.8us,即串口的下一个字节传输来之前,上一个字节的串口中断处理函数务必运行完成,否则数据就会丢帧(关键)。 所以一般来讲,串口中断函数里面都不会去执行大段时间开销的任务,目的就是确保不丢帧,常用的办法是在串口中断里面采用环形队列缓冲区存储数据,数据解析用低优先级的任务去处理(当然也有处理速度的问题)。 环形队列缓冲区存储函数的执行时间在STM32F1里面大概2us不到,在STM32F4里面不足1us,所以当串口中断函数里面只运行环形对接缓冲区存储函数时,即使以波特图921600(传输一个字节10.85us)通讯,数据也不会丢帧。 当存在多个串口接受函数时,此时以STM32F1为例,假设环形队列缓冲区存储函数的执行时间在STM32F1里面为2us,此时存在6个串口中断以波特率921600同时运行,各中断彼此之间不能打断,但是存在子优先顺序,同一时刻6个中断全部挂起,这个时候系统首先响应子优先级第一的串口中断接受函数耗时2us,接着依次响应子优先级23456,当第6个串口中断函数刚开始执行时是第10us,在10—12us时系统正在执行第6个串口中断函数,在10.85us时刻,下一次串口中断又来了,此时便发生了数据丢帧。可以可以想一下,此时在不丢帧情况下,系统能设计的最大串口中断数为5个。 上面是以很极端的例子说明了丢帧在实际系统中是怎么发生的,一般串口通讯波特率不会到921600这么大,并且不是每个串口都必须工作在同一波特率,当工作波特率为115200时,串口接收单个字节为86.8us,此情况下系统能够执行足够多的串口中断函数,仍然能确保不丢帧。所以当系统所需串口中断很多时,可以通讯把波特率降下来,来确保不数据丢帧。 以上只考虑了串口中断彼此之间开销,当系统存在比串口中断接收优先级更好的中断任务时,比如利用外部中断的ppm接收、超声波测距等,为了确保串口不丢帧,需要优先级高于串口中断的任务最大执行时间+串口中断函数执行时间(还有个思路就是在RTOS里提升优先级),务必小于串口接收单个字节所需的时间,才能确保不丢帧。 总结: 1、多个串口通讯时,串口通讯波特率可以降低一点。 2、合计设计优先级,当存在不同波特率通讯时,通讯波特率高的串口中断优先级要高于波特率低的。 3、存在优先级高于串口中断的其它中断任务时,其它中断任务的总的最大时间开销也要考虑。当然对于数据的处理速度涉及到环形队列的大小、应用任务运行消耗时间以及定频接收间隔大小等因素影响!

猜你喜欢

转载自blog.csdn.net/liuandy6612/article/details/83822810