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;
                //恢复中断  
       
}
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
11条回答
okARM
1楼-- · 2020-02-05 10:42
因为每次只能接收一个字节
bg6ixm
2楼-- · 2020-02-05 11:51
收了一个SBUF就把flag置1了,主程序看到1就开始发。
很乱。
muzheyun
3楼-- · 2020-02-05 16:55
楼上正解
首先你上位机就是按照字节发送的,因此单片机也需要按字节接收,实际上不按字节接收也不可能,因为SBUF就是一个8位〔一个字节〕的寄存器,一旦接收够8个,接收中断就置位,等下一个字节的起始位就清空,准备下一个字节的接收。
楼主跟我以前的思维很像,我曾经写过SBUF=cache[512]
最好的办法就是按照楼上的做,接一个发一个。
njlz0707mm
4楼-- · 2020-02-05 19:41
因为51的SBUF是8位的,所以一次只能1 byte
chengkun
5楼-- · 2020-02-05 19:43
 精彩回答 2  元偷偷看……
nydns
6楼-- · 2020-02-05 23:12
muzheyun 发表于 2011-4-1 11:02
楼上正解
首先你上位机就是按照字节发送的,因此单片机也需要按字节接收,实际上不按字节接收也不可能,因 ...

你的意思是不是说.如果发一个字符串abc
那SBUF第一次 接收一个a
第二次接收一个b...
一共接收3次啊...
我理解的对吗

一周热门 更多>