空闲中断的超时是由硬件完成的超时判断,时间为一个数据的传输时间(和波特率校验位和停止位相关)。 心跳相对超时判断原理和IDLE空闲方式差不多,只不过一个是硬件完成,一个由软件完成, 相对来说,软件的这种方式灵活一点,或者说也避免了有些设备串口发送数据的不连续性 (估计是那种带RTOS,然后发送不用IT或者DMA等大致2个数据间隔时间超出空闲时间了)。 心跳方式使用systick里面的心跳计数,和单数据接收一样,如果有数据接收到了将心跳当前值记录下来rxTick, 如果没有新的数据接收到,在任务里面对心跳值比较,方式类似带操作系统的方式 #defineUART1_RX_TIMEOUT 10 if((osKernelGetTickCount()- g_tBspUart.rxTick) >= UART1_RX_TIMEOUT)
osKernelGetTickCount使用了RTX5的心跳获取API接口,方便以后使用RTX5时移植。
接收处理和IDLE空闲还是很类似的,只不过需要程序员自己去查询接收寄存器里面的值是否变化了, 如果变化了开启超时判断超时以后的处理和IDLE是一样的。
对于超时处理,有0,1,2三种情况,具体看图
|