|
今天和昨天寫了一個簡單的串口程序,發現程序怎么都不按自己寫的走,現在才找到問題:
/*串口發送函數*/
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了,所有程序死在了這里。
因此以后再寫串口程序的時候:要注意這個情況。
|
|