找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2508|回复: 0
打印 上一主题 下一主题
收起左侧

【求助】串口运行时如果接收到的不是想要的字符串应该怎么处理,以免干扰到后面的...

[复制链接]
跳转到指定楼层
楼主
ID:90601 发表于 2015-9-20 13:37 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
刚进公司,老板就让写治具的控制板。
电气动作方面已经没有问题。现在的问题是串口通讯有问题:
上位机会不停的发送TEST询问信号,如果我单片机start=0时,会发送DUT_n_start信号,上位机就会开始测试,单片机为跳入while循环等待串口接收到来自上位机的PASS或FAIL信号,
现在的问题是上位机在测试过程中还是会不停的扫描发送TEST询问信号,如果我等待过程中接收了TEST信号,我的程序后面就接收不到PASS或FAIL信号,程序就没法向下运行了。
我在等待状态加了筛选信号的函数,但是又有新情况,现在虽然能接收到PASS或FAIL信号,但是没法确定上位机在第几次发送PASS或FAIL时我会接收到,有时1次就接收到了,有时候要好几次才接收到,我现在用串口助手是可以发送无限次,但是到时候上位机测试软件只会发送一次测试结果的信号,如果单片机接收不到,程序就相当于死机了。。。

我的程式哪里有问题,请大神指点一下,改了两天了,还是有问题。我觉得是我串口接收模块写的有问题,但不知道怎么改
void main()
{
       put_down=1;       //确认下压汽缸处于升起状态
       init();
       delay(500);
       while(1)
      {      
            flag_cy =0;       //光栅中断标志位置0
            EX0 =1;        //光栅中断打开(INT0)
            count=0;      //串口缓冲区计数清零
           delay(100);
           if(Flag==1&&c==1)     //收到RESET信号
           {
                  SendStr("RESET");   //系统复位
                  ISP_CTL =0x60;
           }  
          if(start==0)       //按下开始按键
         {
                _nop_();
                if(start==0)      //去抖动延时
               {
                      _nop_();
                      if(start==0)   //按下开始按键
                      {      
                             flag_cy=0;
                             put_down=0;  //治具下压 ,动作持续1秒
                            delay(1000);
                            delay(1000);      
                            pass=1;   //PASS信号灯保持熄灭
                            fail=1;   //FAIL信号灯保持熄灭
                            testing=0;  //Testing信号灯亮,表明正在测试
                            Flag=0;   //串口接收标志清零
                            d=0;   
                           while(1)
                           {
                                   if(Flag==1&&d==1)  //假如收到上位机询问“是否开测试”信号,就向上位机发送DUT——START信号
                                   {
                                            p=text1;      
                                           SendStr(p);      
                                           count=0;      
                                            Flag=0;        
                                           d=0;
                                           break;        
                                   }
                          }
         
                          delay(1000);    //测试中,黄灯亮
                          delay(1000);
                          delay(1000);    //测试中,黄灯亮
                          delay(1000);
                          delay(1000);    //测试中,黄灯亮
                          delay(1000);
                          delay(1000);    //测试中,黄灯亮
                          delay(1000);
                          EX0 =0;
                          if(Flag==1&&c==1)     //收到RESET信号
                          {
                                ISP_CTL =0x60;
                          }
                         while(1)                                                             //这一段就是上位机测试时我单片机在这个循环中等待,主要问题就是这段和串口中断
                        {
                               SendStr("WAIT");
                               delay(30000);
                               if(Flag==1&&a==1)
                               {
                                     count=0;
                                     SendStr("pass?");
                                      break;
                               }
                               if(Flag==1&&b==1)
                               {
                                     count=0;
                                     SendStr("fail?");
                                     break;
                               }
                              if(Flag==1&&c==1)
                              {  
                                   count=0;
                                   SendStr("RE?");
                                   break;
                              }
                              else
                              {
                                    count=0;
                                    SendStr("clear");
                                    delay(20000);
                                     EA=0;
                                    Flag=0;
                                    for(count=0;count<8;count++)
                                   {
                                          BUF[count]=0;
                                   }
                                   count=0;      
                                    d=0;      
                                    EA=1;
                            }
                 }      
                while(1)
               {
                      if(Flag==1&&a==1)     //收到PASS信号
                       {
                                   SendStr("PASS");      
                                   count=0;
                                   Flag=0;
                                   a=0;
                                   put_down=1;    //解除下压
                                    testing=1;    //黄灯灭
                                  pass=0;     //绿灯亮
                                   buzzer=0;    //蜂鸣器响一声
                                   delay(1000);
                                   buzzer=1;
                                   EX0 =1;
                                   break;
                       }
                       if(Flag==1&&b==1)     //收到FAIL信号
                       {
                                  SendStr("FAIL");
                                   count=0;
                                   Flag=0;
                                    b=0;   
                                   testing=1;      //黄灯灭
                                   fail=0;
                                   buzzer=0;    //蜂鸣器响一声
                                   delay(2000);
                                   delay(1000);
                                   buzzer=1;
                                   delay(2000);
                                   delay(1000);
                                   buzzer=0;    //蜂鸣器响一声
                                   delay(2000);
                                   delay(1000);
                                   buzzer=1;
                                   delay(2000);
                                   delay(1000);
                                   buzzer=0;    //蜂鸣器响一声
                                   delay(2000);
                                   delay(1000);      
                                   buzzer=1;
                                   EX0 =1;
                                   break;
                         }
                        if(Flag==1&&c==1)     //收到RESET信号
                        {
                                   SendStr("RESETC");
                                   ISP_CTL =0x60;
                        }
                        if(flag_cy==1)        //如果外部中断标志位为1.
                        {
                                   SBUF = 'G';
                                   while(!TI);
                                   TI =1;
                                   fail= 1;
                                   pass=1;
                                   testing=1;
                                   flag_cy=0;
                                   break;
                         }
                  }
            }
        }
      }
   }
}

void init()
{
        count=0;
         Flag=0;
         a=0;
         b=0;
         c=0;
         EA = 1;     //总中断允许  
         TMOD = 0x20;          //设置波特率为9600和定时器1工作方式
         TL1 = 0xFD;           //设置初始值
         TH1 = 0xFD;
         SCON = 0x50;          //设置串行口工作方式,波特率。
         PCON = 0x00;
         TR1 = 1;     //允许发送
         IT0=0;               //INT0中断允许   下降沿触发
         EX0 =1;
         ET0 = 1;             //启动定时器
         ES = 1;             //串行中断允许

}


void SendByte(uchar dat)   //串口发送字符函数
{
         SBUF = dat;
         while(!TI);
             TI = 0;
}


void SendStr(uchar *p)        //串口发送字符串嵌套函数
{  
         while(*p!='\0')
         {  
                  SendByte(*p);
                    SBUF= *p++;
           }
}

void delay(uchar time)      //延时
{
         uint a;
         uint b;
         for(a=0;a<time;a++)
         {
                  for(b=0;b<110;b++);
         }
}

void int0(void) interrupt 0   //电平触发    外部中断0,光栅
{   
          EX0 = 0;
          ISP_CTL =0x60;
          EX0 = 1;
}

void Receive(void) interrupt 4         //串口中断                             串口中断,我觉得这里写法可能有问题
{
         ES = 0;
          if (RI == 1)
          {
                   RI = 0;
                    if(count<8)
                  {
                           BUF[count++] = SBUF;
                           if((BUF[0]=='P')&&(BUF[5]=='2'))    //如果接收到PASS_N信号
                           {
                                    Flag=1;
                                    a=1;
                           }
                           if((BUF[0]=='F')&&(BUF[5]=='2'))  //如果接收到FAIL_N信号
                           {
                                    Flag=1;
                                    b=1;
                           }
                           if((BUF[0]=='R')&&(BUF[6]=='2'))  //如果接收到RESET_N信号
                           {
                                    Flag=1;
                                    c=1;
                           }
                           if(BUF[0]=='T')       //如果接收到上位机询问GET_TEST信号
                           {
                                    //  ES=0;
                                    Flag=1;
                                    d=1;
                                    //  count =0;
                                    //  ES=1;
                                
                           }
                           else
                            {
                                    count =0;
                                     Flag=0; // 关闭串口中断,停止接收
                                    // TI=0;
                           }
                  }   
         }
          else
          {
                   TI =0;
         }
          ES = 1;
}   
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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