51單片機串口問題
當串行發(fā)送完畢后,將在標志位 TI 置 1,同樣,當收到了數據后,也會在 RI 置 1。
無論 RI 或 TI 出現了 1,只要串口中斷處于開放狀態(tài),單片機都會進入串口中斷處理程序。
在中斷程序中,要區(qū)分出來究竟是發(fā)送引起的中斷,還是接收引起的中斷,然后分別進行處理。
看到過一些書籍和文章,在串口收、發(fā)數據的處理方法上,很多人都有不妥之處。
接收數據時,基本上都是使用“中斷方式”,這是正確合理的。
即:每當收到一個新數據,就在中斷函數中,把 RI 清零,并用一個變量,通知主函數,收到了新數據。
發(fā)送數據時,很多的程序都是使用的“查詢方式”,就是執(zhí)行 while(TI ==0); 這樣的語句來等待發(fā)送完畢。
這時,處理不好的話,就可能帶來問題。
看了一些網友編寫的程序,發(fā)現有如下幾條容易出錯:
1.有人在發(fā)送數據之前,先關閉了串口中斷!等待發(fā)送完畢后,再打開串口中斷。
這樣,在發(fā)送數據的等待期間內,如果收到了數據,將不能進入中斷函數,也就不會保存的這個新收到的數據。
這種處理方法,就會遺漏收到的數據。
2.有人在發(fā)送數據之前,并沒有關閉串口中斷,當 TI = 1 時,是可以進入中斷程序的。
但是,卻在中斷函數中,將 TI 清零!
這樣,在主函數中的while(TI ==0);,將永遠等不到發(fā)送結束的標志。
3.還有人在中斷程序中,并沒有區(qū)分中斷的來源,反而讓發(fā)送引起的中斷,執(zhí)行了接收中斷的程序。
對此,做而論道發(fā)表自己常用的方法:
接收數據時,使用“中斷方式”,清除 RI 后,用一個變量通知主函數,收到新數據。
發(fā)送數據時,也用“中斷方式”,清除 TI 后,用另一個變量通知主函數,數據發(fā)送完畢。
這樣一來,收、發(fā)兩者基本一致,編寫程序也很規(guī)范、易懂。
更重要的是,主函數中,不用在那兒死等發(fā)送完畢,可以有更多的時間查看其它的標志。
實例:
求一個PC與單片機串口通信的程序,要求如下:
1、如果在電腦上發(fā)送以$開始的字符串,則將整個字符串原樣返回(字符串長度不是固定的)。
2、如果接收到1,則將P10置高電平,接收到0,P10置低電平。(用來控制一個LED)
單片機是STC89C52RC/晶振11.0592/波特率要求是9600或4800。謝謝!
問題補充:可能會將【$ABCD,123456,987654ccc,aasdasd,aaaa,sssd,4D】這樣的字符串(字符串長度約為50-150個字符)傳送給單片機,只能能原樣返回。
最佳答案:
下列程序,已經調試成功。
#include
sbit LED = P1^0;
unsigned char UART_buff;
bit New_rec = 0, Send_ed = 1, Money = 0;
//----------------------------------------------
void main (void)
{
}
//----------------------------------------------
void ser_int (void) interrupt 4
{
}
//----------------------------------------------
評論