微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 求帮助 51单片机串口 实在没办法了

求帮助 51单片机串口 实在没办法了

时间:10-02 整理:3721RD 点击:

从上位机发送多于两个字节,为什么返回上位机时只能接收一个?实在找不到错误点了,求解决,谢谢!

#include<reg51.h>

unsigned char flag,a,i;

unsigned char code table[]="I have ";

void init()

{

  TMOD=0X20;

  TH1=0XF3;

  TL1=0XF3;

  SCON=0X50;

  ES=1;

  EA=1;

  TR1=1;

  }

void main()

{

init();

while(1)

{  

  if(flag==1)

   {

     ES=0;

         for(i=0;i<7;i++)

         {

            SBUF=table;

                while(!TI);

                TI=0;

                }

                SBUF=a;

                while(!TI);

                TI=0;

                ES=1;

                flag=0;

                }

        }

}

        void sar() interrupt 4

        {

         RI=0;

         a=SBUF;

         flag=1;

         }



因为接收到第一个字符的时候标志位flag=1;那么主函数中满足条件flag==1。进入if内部已经关掉中断了。因此接收不到第二个字符。
例外:SBUF=table;这个语句应该改为SBUF=table[i];

啊,我程序写的是SBUF=table,这上面复制错了。
我flag是在发送完之后才置1的也不可以么?那如果想要实现不限制字符的接收,需要怎样修改啊?我才学习,不太会,谢谢啊

非常感谢,但是flag置1是在数据都发送完之后,按理说数据不都应该存在SBUF中了么?如果想要修改,应该怎么做啊?

非常感谢,但是flag置1是在数据都发送完之后,按理说数据不都应该存在SBUF中了么?如果想要修改,应该怎么做啊?

SBUF=table;这是把首地址赋值给sbuf,应该是SBUF=table{i}

1.SBUF=table;这个语句应该改为SBUF=table[i];  这不是重点。
2.SBUF寄存器只有一个字节的储存空间 。这就是为什么你要把I  have分7次送入SBUF。否则的话,你为什么不直接写SBUF=I have?

是啊,我知道了,谢谢啊

嗯,我原程序是这样的,复制的时候不小心给复制错了

应该就是table[i]的问题,你是看郭天祥的吧,其他的都没错。因为如果单片机不能发送第一个字符,那么TI就不能被置1,那么程序就停在while(!TI)了,当然就不能执行后面的程序了。

是的,我已经知道原因了,谢谢啊

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top