2297|0

71

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

求助:各位大哥怎么会出现这样的问题呢?(串口问题) [复制链接]

//-------------------------------------头文件--------------------------------------
#include
#include
#include
//-------------------------------------头文件--------------------------------------

//********定义引脚*************************************
sbit   P33      =    P3^3;    //喂狗
sbit   P23      =    P2^3;
sbit   D2       =    P0^2;   
//********定义引脚*************************************

//**************定义变量*************************************************
int WDogZdJs;   //喂狗中断计数
char  rece[5];      //接收的字符
int   j;
bit   receive;
//**************定义变量*************************************************


void delay()
{
    int i,j;
    for(i=0;i<100;i++)
       {
           for(j=0;j<10;j++)
              {
                  ;
              }
           }
}

void delay2()
{
    int i,j;
    for(i=0;i<100;i++)
       {
           for(j=0;j<500;j++)
              {
                  ;
              }
           }
}


void Sendtex() //向电脑发送字符 '1'
{
    SBUF='1';
  while(!TI)P33=~P33;
  TI=0;
}


void ComInStr() interrupt 4 //串行口中断
{
  if(RI)   //接收
  {
     if (j>4)
       {
               j=0;        
          }
     rece[j]=SBUF;
       j++;
     if(j>4)
       receive=1; //接收标志置位
     RI=0;
  }
   
}


void timer0(void) interrupt 1   //喂狗中断程序
{
  TH0 = (65536-5000)/256;     //重载计数初值 每 5 ms 中断一次
  TL0 = (65536-5000)%256;     //这是手动装置,如果 T0 为模式 1 的话,必须要手动装入
                              //如果如果 T0 为模式 2 的话,只要初始化了,
                              //则在这里可以不要 TH0 = (65536-5000)/256; TL0 = (65536-5000)%256;
  WDogZdJs ++;
  if ( WDogZdJs >= 10 )
       {
       P33 =! P33;  //不停喂狗
       WDogZdJs = 0;
    }
}


void main()
{
  delay();
  P0 = 0xff;
  P1 = 0xff;
  P2 = 0xff;
  P3 = 0xff;      
  P33 =! P33;
   
   EA = 0;
   
  
  TMOD=0x21;                  //定时器1模式1  定时器0模式1
   //---------------------------处理串口中断---------------------------------------
      SCON=0x50;                  //串行口工作方式1, 10 位异步收发,波特率由定时器控制
   PCON |= 0x00;
   TL1=0xFA;
   TH1=0xFA;                   //22.1184M晶振 波特率9600
   
   //---------------------------处理串口中断---------------------------------------
   
   //------------------------------处理中断喂狗------------------------------------  
   TH0 = (65536-1000)/256;     //预置计数初值,每 5 ms 中断一次
   TL0 = (65536-1000)%256;
   
   //------------------------------处理中断喂狗------------------------------------
   
   EA = 1 ;                    //允许中断
   ES = 1 ;                    //允许串行中断
   ET0 = 1;                    //T/C0 开中断(定时器0/计数器0)
   ET1 = 0;                    //T/C0 开中断(定时器0/计数器0)
   
   TR1=1;                      //启动定时器1/计数器1
   TR0 = 1;                   //启动定时器0/计数器0

   while(1)
    {
          if(receive)
              {
                Sendtex();
            receive = 0;         
              }                  
     }
}


请教:
void ComInStr() interrupt 4 //串行口中断
{
  if(RI)   //接收
  {
     if (j>4)
       {
               j=0;        
          }
     rece[j]=SBUF;
       j++;
     if(j>4)
     receive=1; //接收标志置位
     RI=0;
  }
   
}

说明介绍 5 个字符则  receive 置为 1

现在情况是这样的:
现象1:
当我用串口调试软件 发 '11111' 则 执行了 Sendtex();
是正确的
现象2:
我首先发送字符串 '111' ,没有执行 Sendtex(),
可是然后我发 字符串 '11' ,则执行 Sendtex(),
是两次总共发了 5 个字符啊。

是不是我需要自己写一个东西
表示多久没有接收到 新星,则把
前面的清空,

一般是多久啊?
这样的程序怎么写?

谢谢!
点赞 关注

回复
举报
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/7 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表