代码有时会卡在while(!TI)处,导致看门狗超时单片机重启。原因是在判断“!TI”前进了串口中断,TI清零了,然后再判断“!TI”,导致为真,卡在#1处,进而看门狗超时单片机重启。
void uart_byte_send(uint8_t dat8)
{
TI = 0;
SBUF = dat8;
while(!TI); //#1
TI = 0;
}
void uart_interrupt_receive(void) interrupt 4
{
if(RI==1)
{
RI=0;
//用户代码
}
if(TI==1) //#2
{
TI=0;
}
}
解决方法,修改如下:
void uart_byte_send(uint8_t dat8)
{
ES=0; //关闭串口中断
TI = 0;
SBUF = dat8;
while(!TI); //#1
TI = 0;
ES=1; //打开串口中断
}