51单片机中 SBUF为什么不能一次性接收到上位机发送的数据

2020-02-05 09:06发布

最近做一个串口调试试验,想实现从上位机(串口调试助手)中发送一窜字符,单片机产生中断 接收到后将其存储在一个数组里,最后主函数里检测到中断标志,再将该字符串返回到上位机(串口调试助手)。  但是 调试时发现在上位机中 只有连续发送一窜字符超过5次,单片机才能将其完整的返回,前几次只返回前两位字符,而且每次发送都是返回两次,小弟实在是不明白怎么回事,希望大侠您帮一下。
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
uchar b=1;uint i,j;
uchar  table1[30];
uchar   table[]="return  ";
uchar count,flag;
void DelayMs(uint ms)
{     uint i;     while(ms--)   
        {      
                for(i = 0; i < 120; i++);   
        }
}
void main()
{   
        flag=0;
                TMOD=0x21;
                 SCON=0x50;
                TH0=(65536-50000)/256;
                TL0=(65536-50000)%256;
                TH1=0xfd;
                TL1=0xfd;
                TR1=1;
                ET0=1;
                SM0=0;
                SM1=1;
                REN=1;
                EA=1;
                ES=1;
   
                while(1)
                 
        {               
                if(flag==1)     
                        {     
                        ES=0;         
                 for(i=0;i<6;i++)           
                           {                  
                                SBUF=table;               
                            while(!TI);               
                                   TI=0;            
                        }
       
               
                  while(flag==1)
                        {       
                                flag=0;
                        for(i=0;i<30;i++)
                                {
                                                                                                                                        SBUF=table1;                  
                                while(!TI);                  
                                TI=0;
                                }
                                DelayMs(250);
                                DelayMs(250);
                                DelayMs(250);
                                DelayMs(250);
                                DelayMs(250);
                                DelayMs(250);
                                DelayMs(250);
                                DelayMs(250);
                                DelayMs(250);
                               
                                ES=1;
        //        flag=0;
                                count=0;
                        //        while(1);
                }
        }
        }
}
void ISRSER() interrupt 4 using 3 //串口中断
{    // RI=0;// for(i=0;i<10;i++)// {// table1=SBUF;// }       // P1=SBUF;// b=1; void ISRSER() interrupt 4 using 3 //串口中断
         
         EA=0;  //关中断,防止其它中断打扰
          if (RI)   
                   {
                table1[count] = SBUF;
                count++;
                flag=1;
                RI=0;                  
                }   
        EA=1;
                //恢复中断  
       
}
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。