久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 35933|回復(fù): 7
收起左側(cè)

51單片機(jī)串口通信的發(fā)送與接收

[復(fù)制鏈接]
ID:140725 發(fā)表于 2017-3-5 03:35 | 顯示全部樓層 |閱讀模式
0.png

51單片機(jī)的串口,是個全雙工的串口,發(fā)送數(shù)據(jù)的同時,還可以接收數(shù)據(jù)。
當(dāng)串行發(fā)送完畢后,將在標(biāo)志位 TI 置 1,同樣,當(dāng)收到了數(shù)據(jù)后,也會在 RI 置 1。
無論 RI 或 TI 出現(xiàn)了 1,只要串口中斷處于開放狀態(tài),單片機(jī)都會進(jìn)入串口中斷處理程序。
在中斷程序中,要區(qū)分出來究竟是發(fā)送引起的中斷,還是接收引起的中斷,然后分別進(jìn)行處理。
看到過一些書籍和文章,在串口收、發(fā)數(shù)據(jù)的處理方法上,很多人都有不妥之處。
接收數(shù)據(jù)時,基本上都是使用“中斷方式”,這是正確合理的。
即:每當(dāng)收到一個新數(shù)據(jù),就在中斷函數(shù)中,把 RI 清零,并用一個變量,通知主函數(shù),收到了新數(shù)據(jù)。
發(fā)送數(shù)據(jù)時,很多的程序都是使用的“查詢方式”,就是執(zhí)行 while(TI ==0); 這樣的語句來等待發(fā)送完畢。
這時,處理不好的話,就可能帶來問題。
看了一些網(wǎng)友編寫的程序,發(fā)現(xiàn)有如下幾條容易出錯:
1.有人在發(fā)送數(shù)據(jù)之前,先關(guān)閉了串口中斷!等待發(fā)送完畢后,再打開串口中斷。
這樣,在發(fā)送數(shù)據(jù)的等待期間內(nèi),如果收到了數(shù)據(jù),將不能進(jìn)入中斷函數(shù),也就不會保存的這個新收到的數(shù)據(jù)。
這種處理方法,就會遺漏收到的數(shù)據(jù)。
2.有人在發(fā)送數(shù)據(jù)之前,并沒有關(guān)閉串口中斷,當(dāng) TI = 1 時,是可以進(jìn)入中斷程序的。
但是,卻在中斷函數(shù)中,將 TI 清零!
這樣,在主函數(shù)中的while(TI ==0);,將永遠(yuǎn)等不到發(fā)送結(jié)束的標(biāo)志。
3.還有人在中斷程序中,并沒有區(qū)分中斷的來源,反而讓發(fā)送引起的中斷,執(zhí)行了接收中斷的程序。
對此,做而論道發(fā)表自己常用的方法:
接收數(shù)據(jù)時,使用“中斷方式”,清除 RI 后,用一個變量通知主函數(shù),收到新數(shù)據(jù)。
發(fā)送數(shù)據(jù)時,也用“中斷方式”,清除 TI 后,用另一個變量通知主函數(shù),數(shù)據(jù)發(fā)送完畢。
這樣一來,收、發(fā)兩者基本一致,編寫程序也很規(guī)范、易懂。
更重要的是,主函數(shù)中,不用在那兒死等發(fā)送完畢,可以有更多的時間查看其它的標(biāo)志。


下面是個實(shí)際的問題,答案在附件里。
求一個單片機(jī)串口通信程序  懸賞分:50 | 解決時間:2011-9-19 22:39 |
求一個PC與單片機(jī)串口通信的程序,要求如下:
1、如果在電腦上發(fā)送以$開始的字符串,則將整個字符串原樣返回(字符串長度不是固定的)。
2、如果接收到1,則將P10置高電平,接收到0,P10置低電平。(用來控制一個LED)
單片機(jī)是STC89C52RC/晶振11.0592/波特率要求是9600或4800。謝謝!
問題補(bǔ)充:可能會將【$ABCD,123456,987654ccc,aasdasd,aaaa,sssd,4D】這樣的字符串(字符串長度約為50-150個字符)傳送給單片機(jī),只能能原樣返回。

問題答案:

下面看一個網(wǎng)上的題目,以及做而論道的解答。

求一個單片機(jī)串口通信程序  懸賞分:50 | 解決時間:2011-9-19 22:39 |
求一個PC與單片機(jī)串口通信的程序,要求如下:
1、如果在電腦上發(fā)送以$開始的字符串,則將整個字符串原樣返回(字符串長度不是固定的)。
2、如果接收到1,則將P10置高電平,接收到0,P10置低電平。(用來控制一個LED)

單片機(jī)是STC89C52RC/晶振11.0592/波特率要求是9600或4800。謝謝!

問題補(bǔ)充:可能會將【$ABCD,123456,987654ccc,aasdasd,aaaa,sssd,4D】這樣的字符串(字符串長度約為50-150個字符)傳送給單片機(jī),只能能原樣返回。
//----------------------------------------------
最佳答案:

下列程序,已經(jīng)調(diào)試成功。
#include <REG52.H>

sbit LED = P1^0;
unsigned char UART_buff;
bit New_rec = 0, Send_ed = 1, Money = 0;
//----------------------------------------------
void main (void)
{
    SCON = 0x50;   //串口方式1, 8-n-1, 允許接收.
    TMOD = 0x20;   //T1方式2
    TH1 = 0xFD;    //9600bps@11.0592MHz
    TL1 = 0xFD;
    TR1 = 1;                        
    ES  = 1;       //開中斷.
    EA  = 1;

    while(Money == 0);    //等著交費(fèi),呵呵,等著接收$.

    while(1)  {
      if ((New_rec == 1) && (Send_ed == 1))  {  //如果收到新數(shù)據(jù)及發(fā)送完畢
        SBUF = UART_buff; //那就發(fā)送.
        New_rec = 0;
        Send_ed = 0;
    } }
}
//----------------------------------------------
void ser_int (void) interrupt 4
{
    if(RI == 1) {  //如果收到.
      RI = 0;      //清除標(biāo)志.
      New_rec = 1;
      UART_buff = SBUF;  //接收.
      if(UART_buff == '1')  LED = 1;
      if(UART_buff == '0')  LED = 0;
      if(UART_buff == '$')  Money = 1;
    }
    else  {        //如果送畢.
      TI = 0;      //清除標(biāo)志.
      Send_ed = 1;
    }
}
//----------------------------------------------
回答時間:9-19 14:19 |
回答者: 做而論道 | 十五級采納率:42%
提問者對于答案的評價:測試通過。感謝。
原題網(wǎng)址:http://zhidao.baidu.com/question/320858150.html
后記:該題目的幾個答案,都不正確,丟失數(shù)據(jù)的現(xiàn)象比較嚴(yán)重,大家可以自己測試一下。


相關(guān)帖子

回復(fù)

使用道具 舉報

ID:47286 發(fā)表于 2017-3-5 16:30 | 顯示全部樓層
樓主 請教一下 你這個程序怎么解決長度問題呢 他說長度不固定 那怎么知道數(shù)據(jù)接收完了
回復(fù)

使用道具 舉報

ID:151348 發(fā)表于 2017-3-6 16:17 | 顯示全部樓層
做而論道的程序簡潔明了,不錯
回復(fù)

使用道具 舉報

ID:282520 發(fā)表于 2018-2-6 10:21 | 顯示全部樓層
為啥我在發(fā)送緩沖區(qū)發(fā)送字符0沒用  
回復(fù)

使用道具 舉報

ID:20672 發(fā)表于 2018-7-25 19:34 | 顯示全部樓層
謝謝分享,一定要學(xué)會了。
回復(fù)

使用道具 舉報

ID:27770 發(fā)表于 2018-7-26 06:33 | 顯示全部樓層
這種基礎(chǔ)題目,應(yīng)該不算難題.至于驗證時出現(xiàn)問題,不一定回答題目答案! 答案是文字,軟件,使用硬件驗證,會有另外的其他問題. 許多軟件,都不是每一臺電腦可以正常運(yùn)行的. 原因就是硬件也有差別.
回復(fù)

使用道具 舉報

ID:396581 發(fā)表于 2018-10-23 10:07 | 顯示全部樓層
copy的都不全,如果大家想去看全的可以去CSDN看
回復(fù)

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 久久精品性视频 | 午夜伦理影院 | 男女羞羞视频网站 | 亚洲视频一区在线 | 99热这里都是精品 | 九九热精品视频 | 亭亭五月激情 | 精品国产91乱码一区二区三区 | 九九色九九| 欧美视频1区 | 国产真实精品久久二三区 | 国产97在线视频 | 中文字幕 国产 | 欧美精品黄 | 欧美精品一区二区三区在线播放 | 欧美一级二级三级 | 亚洲精选一区二区 | 羞羞的视频在线看 | 亚洲综合婷婷 | 国产精品一区二区在线 | 毛片免费在线观看 | 欧美一级在线观看 | a看片| 18av在线播放 | 亚洲人人 | 久久精品亚洲精品国产欧美 | 日本不卡免费新一二三区 | 波多野结衣电影一区 | 91免费版在线 | 毛片综合| 久久国产婷婷国产香蕉 | 日韩精品成人av | 在线观看日本网站 | 成人av免费播放 | 日本亚洲精品成人欧美一区 | 91久久精品国产91久久性色tv | 毛片在线看看 | 91精品久久久久久久 | 亚洲欧洲国产视频 | 日日操夜夜操天天操 | 国外成人在线视频 |