搜索
bottom↓
回复: 11

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

[复制链接]

出0入0汤圆

发表于 2011-3-31 09:54:16 | 显示全部楼层 |阅读模式
最近做一个串口调试试验,想实现从上位机(串口调试助手)中发送一窜字符,单片机产生中断 接收到后将其存储在一个数组里,最后主函数里检测到中断标志,再将该字符串返回到上位机(串口调试助手)。  但是 调试时发现在上位机中 只有连续发送一窜字符超过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;
                //恢复中断  
       
}

阿莫论坛20周年了!感谢大家的支持与爱护!!

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)

出0入0汤圆

发表于 2011-4-1 09:48:02 | 显示全部楼层
因为每次只能接收一个字节

出0入0汤圆

发表于 2011-4-1 10:00:44 | 显示全部楼层
收了一个SBUF就把flag置1了,主程序看到1就开始发。
很乱。

出0入0汤圆

发表于 2011-4-1 11:02:23 | 显示全部楼层
楼上正解
首先你上位机就是按照字节发送的,因此单片机也需要按字节接收,实际上不按字节接收也不可能,因为SBUF就是一个8位〔一个字节〕的寄存器,一旦接收够8个,接收中断就置位,等下一个字节的起始位就清空,准备下一个字节的接收。
楼主跟我以前的思维很像,我曾经写过SBUF=cache[512]
最好的办法就是按照楼上的做,接一个发一个。

出0入0汤圆

发表于 2011-4-1 11:19:26 | 显示全部楼层
因为51的SBUF是8位的,所以一次只能1 byte

出0入0汤圆

 楼主| 发表于 2011-4-2 21:33:04 | 显示全部楼层
谢谢 ,各位的解答,问题解决了。

出0入0汤圆

发表于 2012-6-13 16:38:50 | 显示全部楼层
muzheyun 发表于 2011-4-1 11:02
楼上正解
首先你上位机就是按照字节发送的,因此单片机也需要按字节接收,实际上不按字节接收也不可能,因 ...

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

出0入0汤圆

发表于 2012-6-13 23:24:11 | 显示全部楼层
nydns 发表于 2012-6-13 16:38
你的意思是不是说.如果发一个字符串abc
那SBUF第一次 接收一个a
第二次接收一个b...

是这样。。。。

出0入0汤圆

发表于 2012-6-14 00:18:25 | 显示全部楼层
呵呵,楼主把51内部串口工作原理看一遍就解决问题了

出0入0汤圆

发表于 2012-6-14 08:54:51 | 显示全部楼层
qiangrui 发表于 2012-6-14 00:18
呵呵,楼主把51内部串口工作原理看一遍就解决问题了

恩恩...一定看...我只要一学习就困...哈哈...谢谢各位

出0入0汤圆

发表于 2012-6-14 08:55:29 | 显示全部楼层
tlptotop 发表于 2012-6-13 23:24
是这样。。。。

谢谢.原来是这样啊...

出0入0汤圆

发表于 2012-6-14 10:07:32 | 显示全部楼层
BUF只有八位,一次只能接一个byte,但可以将接收到的数据进行处理,转到别的地方存下来
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-7-6 18:23

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表