微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 串口运行时如果接收到的不是想要的字符串应该怎么处理,以免干扰到后面的程序运行

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

时间:10-02 整理:3721RD 点击:
刚进公司,老板就让写治具的控制板。
电气动作方面已经没有问题。现在的问题是串口通讯有问题:
上位机会不停的发送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;
}   

上位机协议里面没有反馈吗,只发一次的话由于各种原因可能会接收不到,这样的话让上位机继续发,单片机接收到以后发送一个反馈信号给上位机表示收到

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

网站地图

Top