|
今天和昨天写了一个简单的串口程序,发现程序怎么都不按自己写的走,现在才找到问题:
/*串口发送函数*/
void txd_uart(uchar txd)
{
SBUF=txd;
while(TI!=1);
TI=0;
}
/*串口中断函数*/
void uart()interrupt 4
{
if(RI)
{
uart_table[global_num]=SBUF;
global_num++;
if(global_num>100)
global_num=0;
global_sign=1;
RI=0;
}
if(TI)
TI=0;
}
我的这个程序是:电脑先给单片机发数,单片机通过中断收到数后存到uart_table[];然后我单片机再把收到的数发给电脑,在电脑上显示出来,我按上面这个这样写,发现程序跑着跑着就死了,后来把中断函数里红色的语句屏蔽后,程序又按自己的想法来跑。
仔细分析一下:
串口发送函数里蓝色部分的语句,当发送完成,串口立马进入中断,此时while(TI!=1);可能还没被执行到 ,但是我在中断了写了if(TI)TI=0;这条语句,直接又把TI置0,当退出中断后,程序继续执行while(TI!=1);但是TI已经变为0了,所有程序死在了这里。
因此以后再写串口程序的时候:要注意这个情况。
|
|