如题,在做
通信时需要用到定时器来设置超时。LPC1768
timer0 初始化程序如下
T0PR = 24000000/1000000 * 100; // 100us
T0PC = 0;
T0TC = 0;
T0MR0 = timerInterval; // 10ms
T0MCR = 3;
T0TCR = 0; // Timer Counter and Prescale Counter Disabled
在Uart的中断函数(每次接收到一个字节数据,会进入中断),复位timer0. 这样每次接收一字节数据,timer0复位一次,当一帧数据传输完毕,Uart不再接收到数据,此时timer0不在复位,当计时时间(10ms)到达后,进入timer0定时中断函数(由此判断一帧数据接收完毕),处理该帧数据。
在绝大多数情况下,通信没有问题。但是当将Uart波特率设置为:9600,上位机PC向下位机传输14字节数据数据时,实际结果是,下位机当接收到第8个字节数据时,产生了定时器中断,退出中断后,继续接收完剩下的数据。并不是接收完全部数据后,产生定时器超时中断,分析可能有两种原因:
原因1:PC上位机在发送第8个字节和第9个字节数据之间 间隔了10ms,导致定时器产生超时定时中断。但不可能,因为我是将这个14个数据一次写入串口调试助手,然后一次发送完毕,不可能会出现这种情形
原因2:在进入UART接收中断中,timer0并没有被复位,导致计时到达,产生超时中断。因为UART传输8个字节数据的时间为( 8 * 11bit * 1000 / 9600 = 9ms)(定时器设置:8个数据位、一个开始位、一个停止位、一个校验位,共11个位),那么就是timer根本就没有被复位。但这种情况也不可能发生,原因如下,
我再次由PC串口调试助手,一次发送17个字节数据,却没有这种现象,按照预想的接收数据,一次接收完17个字节数据后,等待超时中断,进入中断处理数据。若是上述原因,就无法解释这里。而且只在一次传输14或15个字节数据,才会有上述现象。
当我将timer超时时间设为11ms以上时,一次传输14或15个字节数据,又没有上述现象。
虽然可以将超时时间设置长一点解决这个问题,但是还是不是很理解这种现象产生的原因,来
论坛就大家指教
0