打印
[51单片机]

请教一个单片机的串口通讯程序

[复制链接]
1265|10
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
liwei0125|  楼主 | 2018-11-28 12:50 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
这是一个单片机开发板附带的串口通讯例程,把这个程序写入单片机后,通过串口与电脑相连,在串口助手发送区发送任何数据,都能在接收区收到程序返回的数据,从程序分析来看,接收后的数据再返回只是在中断程序中实现的,与“发送一个字节”和“发送一个字符串”这2个子程序应该是没关系的,但是当我把“发送一个字节”和“发送一个字符串”这2个子程序屏蔽掉以后,接收区就收不到程序返回的数据了,请问这是为什么呢?
#include<reg52.h>                     
void SendStr(unsigned char *s);
void InitUART  (void)
{
    SCON  = 0x50;                    
    TMOD |= 0x20;               
    TH1   = 0xFD;              
    TR1   = 1;                                       
    EA    = 1;                  
   // ES    = 1;                  
}                           

void main (void)
{
  InitUART();
  SendStr("UART test, 请在发送 区输入任意信息");
  ES    = 1;                 
  while (1)   {    }               
}

/*------------------------------------------------
                    发送一个字节
------------------------------------------------*/
void SendByte(unsigned char dat)
{
SBUF = dat;
while(!TI);
      TI = 0;
}
/*------------------------------------------------
                    发送一个字符串
------------------------------------------------*/
void SendStr(unsigned char *s)
{
while(*s!='\0')// \0 表示字符串结束标志,通过检测是否字符串末尾
  {
  SendByte(*s);
  s++;
  }
}
/*------------------------------------------------
                     串口中断程序
------------------------------------------------*/
void UART_SER (void) interrupt 4 //串行中断服务程序
{
    unsigned char Temp;          //定义临时变量
   
    if(RI)                        //判断是接收中断产生
    {
      RI=0;                      //标志位清零
      Temp=SBUF;           //读入缓冲区的值;                                                                 
      SBUF=Temp;           //把接收到的值再发回电脑端
      if(TI)                     //如果是发送标志位,清零
        TI=0;
    }
}

相关帖子

沙发
ningling_21| | 2018-11-28 13:17 | 只看该作者
为何屏蔽掉

使用特权

评论回复
板凳
liwei0125|  楼主 | 2018-11-28 13:27 | 只看该作者

熟悉下程序。做做实验而已

使用特权

评论回复
地板
ningling_21| | 2018-11-28 13:58 | 只看该作者
liwei0125 发表于 2018-11-28 13:27
熟悉下程序。做做实验而已

屏蔽掉后的程序是怎样的

使用特权

评论回复
5
liwei0125|  楼主 | 2018-11-28 14:14 | 只看该作者
本帖最后由 liwei0125 于 2018-11-28 14:17 编辑
ningling_21 发表于 2018-11-28 13:58
屏蔽掉后的程序是怎样的

屏蔽掉这2个子程序后,串口助手的接收区就没有回传的数据了,但是回传的数据不是靠SBUF=Temp这句话实现的吗?与那2个子程序有何相干呢?

使用特权

评论回复
6
ningling_21| | 2018-11-28 14:57 | 只看该作者
liwei0125 发表于 2018-11-28 14:14
屏蔽掉这2个子程序后,串口助手的接收区就没有回传的数据了,但是回传的数据不是靠SBUF=Temp这句话实现的 ...

肯定是程序的问题

使用特权

评论回复
7
liwei0125|  楼主 | 2018-11-28 15:09 | 只看该作者

这是开发板的例程啊,如果程序有问题,那早就有人反映了,再说也确实看不出哪里有问题啊

使用特权

评论回复
8
ningling_21| | 2018-11-28 15:10 | 只看该作者
liwei0125 发表于 2018-11-28 15:09
这是开发板的例程啊,如果程序有问题,那早就有人反映了,再说也确实看不出哪里有问题啊 ...

屏蔽后的程序呢

使用特权

评论回复
9
liwei0125|  楼主 | 2018-11-28 15:22 | 只看该作者

#include<reg52.h>                     
void SendStr(unsigned char *s);
void InitUART  (void)
{
    SCON  = 0x50;                    
    TMOD |= 0x20;               
    TH1   = 0xFD;              
    TR1   = 1;                                       
    EA    = 1;                  
   // ES    = 1;                  
}                           

void main (void)
{
  InitUART();
  SendStr("UART test, 请在发送 区输入任意信息");
  ES    = 1;                 
  while (1)   {    }               
}

/*------------------------------------------------
                     串口中断程序
------------------------------------------------*/
void UART_SER (void) interrupt 4 //串行中断服务程序
{
    unsigned char Temp;          //定义临时变量
   
    if(RI)                        //判断是接收中断产生
    {
      RI=0;                      //标志位清零
      Temp=SBUF;           //读入缓冲区的值;                                                                 
      SBUF=Temp;           //把接收到的值再发回电脑端
      if(TI)                     //如果是发送标志位,清零
        TI=0;
    }
}

使用特权

评论回复
10
liwei0125|  楼主 | 2018-11-28 15:35 | 只看该作者
结帖吧,刚才又试了下,有回传数据了,昨天死活都没数据出来

使用特权

评论回复
11
mohanwei| | 2018-11-28 16:35 | 只看该作者
InitUART();
  SendStr("UART test, 请在发送 区输入任意信息");——屏蔽后就死在这里了,然后后面那行串口中断没打开,就无法进入串口中断
  ES    = 1;

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

19

主题

69

帖子

0

粉丝