找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2499|回復(fù): 6
打印 上一主題 下一主題
收起左側(cè)

新手疑惑 關(guān)于C51單片機(jī)串口通訊的問題,挺急的在線等

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:379876 發(fā)表于 2018-7-31 23:08 | 只看該作者 |只看大圖 回帖獎勵 |倒序瀏覽 |閱讀模式
50黑幣
各位好,本人由于剛剛接觸51單片機(jī),在學(xué)習(xí)串口通訊中遇到了困難,



問題是:
由串口助手輸入字符串后,再返回到串口助手上的字符串卻有丟失,丟失的特點為,間隔丟失。
自己的理解:
函數(shù)中有比較函數(shù) strstr(),輸入ready后,可以繼續(xù)運(yùn)行(led會滅)
所以rec數(shù)組所存的是輸入串口助手中的字符串,但顯示出來卻是“ray”,
應(yīng)該是send_str()函數(shù)有問題,但找不出原因。

請求老手指點!不勝感激!!
由于是新手,如果能夠解釋得清楚一些就更好了!
下面是我的源碼:
  1. #include "reg52.h"
  2. #include   <string.h>
  3. #include   <stdio.h>
  4. #include   <stdlib.h>
  5. #include   <intrins.h>

  6. typedef unsigned char u8;
  7. typedef unsigned int u16;

  8. sbit LED=P2^0;

  9. u8 rec_ct=0;                        //記錄接收數(shù)據(jù)的位數(shù)
  10. u8 rec_flag=0;                        //接收完成標(biāo)志
  11. u8 rec[10];                                //定義一個數(shù)組

  12. void delay3s(void)      //延時3s,誤差 0us
  13. {
  14.     unsigned char a,b,c;
  15.     for(c=254;c>0;c--)
  16.         for(b=96;b>0;b--)
  17.             for(a=60;a>0;a--);
  18.     _nop_();  //if Keil,require use intrins.h
  19. }

  20. void delay500ms(void)   //延時0.5s,誤差 0us
  21. {
  22.     unsigned char a,b,c;
  23.     for(c=205;c>0;c--)
  24.         for(b=116;b>0;b--)
  25.             for(a=9;a>0;a--);
  26. }



  27. void UsartInit()                //串口初始化
  28. {
  29. SCON=0x50;                        //串口設(shè)置
  30. TMOD=0X20;                        //T1計數(shù)器設(shè)置
  31. PCON=0x80;                        //倍增打開
  32. TH1=0xf3;
  33. TL1=0xf3;                        //波特率設(shè)為4800;
  34. EA=1;                                //IE設(shè)置
  35. ES=1;
  36. TR1=1;                                //開始計數(shù)
  37. }


  38. void send_str()                        //發(fā)送接收到的字符串
  39. {
  40. u8 i;
  41. for(i=0;i<10;i++)
  42. {
  43.   SBUF=rec[i];
  44.   while(!TI);
  45.   TI=0;
  46.   i++;
  47. }
  48. }



  49. void Ustar() interrupt 4
  50. {
  51. if(RI==1)
  52. {
  53.   RI=0;
  54.   rec[rec_ct]=SBUF;                        //接收串口數(shù)據(jù)
  55.   rec_ct++;
  56.   if(rec_ct==10) rec_ct=0;        //防止溢出
  57.   rec_flag = 1;
  58. }
  59. }


  60. void main()
  61. {
  62. u8 ct;
  63. UsartInit();

  64. start:

  65.          ct = 0;
  66.         while(1)
  67.         {        
  68.                 LED=0;                              //這個燈作為指示燈
  69.                 delay3s();                          //等待3S
  70.                 if(rec_flag == 1)                   //串口接收到數(shù)據(jù)
  71.                 {
  72.             rec_flag = 0;
  73.                         send_str();                                                //發(fā)送接收到的字符串
  74.                         if(strstr(rec, "ready"))        //有沒有ready
  75.                         {
  76.                                 P2 = 0xff;                   //接收到正確的回復(fù)就滅
  77.                                 delay500ms();
  78.                                 break;
  79.                         }
  80.         }
  81.                 ct ++;
  82.                 if(ct>=3) goto start;               //超過三次重新開始     
  83.   }
  84.   while(1);
  85. }



復(fù)制代碼




最佳答案

查看完整內(nèi)容

你的send_str函數(shù)里面已經(jīng)在for循環(huán)里將i++了,然后你TI = 0;后依然i++。檢查一下。 void send_str(void) //發(fā)送接收到的字符串 { u8 i; for(i=0; i
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報

沙發(fā)
ID:221865 發(fā)表于 2018-7-31 23:08 | 只看該作者
你的send_str函數(shù)里面已經(jīng)在for循環(huán)里將i++了,然后你TI = 0;后依然i++。檢查一下。
void send_str(void)                        //發(fā)送接收到的字符串
{
    u8 i;
    for(i=0; i<10; i++)
    {
        TI = 0;
        SBUF=rec[i];
        while(!TI);
        TI = 0;
    }
}
回復(fù)

使用道具 舉報

板凳
ID:375003 發(fā)表于 2018-8-1 01:21 | 只看該作者
把發(fā)送也要寫到中斷里,不能這樣寫
回復(fù)

使用道具 舉報

地板
ID:375003 發(fā)表于 2018-8-1 01:22 | 只看該作者
象這樣寫.
void intSIO() interrupt 4 using 2
{
if(TI){
  TI=OFF;
  if(bSD){
   if(curSND<lenSND) SBUF=bufSND[curSND++];
   else {bSD=OFF;/*mSI=0;*/}}}
if(RI){
  RI=OFF;
  bufRCV[putRCV++]=SBUF;
  putRCV &= 0X07;}
}
回復(fù)

使用道具 舉報

5#
ID:379876 發(fā)表于 2018-8-1 07:38 | 只看該作者
那請問將發(fā)送寫入中斷后,如何觸發(fā)TI=1的條件呢?如果不能觸發(fā)TI=1就不能將數(shù)據(jù)寫入SBUF,而數(shù)據(jù)沒有寫入SBUF,就無法觸發(fā)TI=1的條件,這是個死循環(huán)啊。。。。。。 我的理解是這樣的
回復(fù)

使用道具 舉報

6#
ID:381546 發(fā)表于 2018-8-1 09:39 | 只看該作者
void intSIO() interrupt 4 using 2
{
    if(TI)
    {
        TI=OFF;
        if(bSD)
        {
        if(curSND<lenSND) SBUF=bufSND[curSND++];
       else {bSD=OFF;/*mSI=0;*/}}}
      if(RI){
         RI=OFF;
          bufRCV[putRCV++]=SBUF;
            putRCV &= 0X07;}
}
回復(fù)

使用道具 舉報

7#
ID:379876 發(fā)表于 2018-8-2 08:21 | 只看該作者
謝謝各位前輩給我的建議和熱心的解答!但是我的問題是為什么會出現(xiàn)這樣的情況以及解決方法,最佳答案只能給解決了這兩個問題的人哈。大家對我編程的建議我都應(yīng)用在后續(xù)程序中了,使得邏輯更加清晰了,非常感謝!
回復(fù)

使用道具 舉報

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

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表