void UartPutChar(uint8 d)
{
SBUF=d; //将数据写入到串口缓冲
Sending=1; //设置发送标志
while(Sending); //等待发送完毕
}
如果在一个复杂的程序里,除了UART中断还有其它中断程序,容易出问题哦!
当SBUF=d后,如果一个执行时间超过串口发送时间的中断产生,
如果UART的中断优先级比较高,先将sending清零,
等所有中断都执行完毕,则
Sending=1; //设置发送标志
while(Sending); //等待发送完毕
无异是死循环!
虽然这个概率很小,不得不防哦!
本人就吃过中断函数的苦,比如定时中断程序对一个2字节的UINT16定时减一,
主程序判断这个数是否为0,就会出现小概率的延时不准的错误。
比如T0工作于10ms定时中断,
UINT16 a;
在中断函数里有指令:if(a>0) a--;
在主程序里:
a=300;
do{}while(a!=0);
一般情况下,会延时300×10ms,
也可能只延时(300-256)×10ms。
如果a=256时,
主程序先判断a的低字节是否是0,再判断高字节是否为0,就可能出现问题。
原理就不说了。 |