//检测超时函数 供定时器中断调用-1ms一次 // t为超时时间 __inline void Chk_TimeOut(u8 t) { if(!uartRMsg.rcOK && (uartRMsg.rcIndex>=8) && (++uartRMsg.rcS >=t) ) //超时之后,开始重新解码 uartRMsg.rcOK = true; } //接收函数, 供USART中断调用 __inline void Recieve_MSG(char ch) { uartRMsg.rcS = 0; //如果接收到数据,则清除超时检测计数, if(!uartRMsg.rcOK) { uartRMsg.Buf.buf[uartRMsg.rcIndex ++] = ch; //赋值 if(uartRMsg.rcIndex>=8 && uartRMsg.Buf.msg.cmd!=16)//其他条件成立的时候也可进入解码程序<此程序为Modbus应用,可改为接收到结束符等> uartRMsg.rcOK = true; } } //供主函数调用 void MSGTransfer(void) { if(!uartRMsg.rcOK) return; //......数据解析部分 }
每次串口中断都清零超时检测计数uartRMsg.rcS,++uartRMsg.rcS >=t)这个还会成立
这种设计方法的意思就是,那个定时器中断,每1ms会发生一次,如果连续t毫秒还没有收到串口数据,则认为一包已经接收完成
然后这个计时标志,在每次收到串口数据后就应该清0