⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.c

📁 用单片机实现(载波监听/冲突检测)的功能
💻 C
📖 第 1 页 / 共 5 页
字号:
                while((IFG1 & UTXIFG0) == 0 ) ; 
                TXBUF0 = ReceviceBuff[0];
                SendData(CodeTable[1], 7);          //总线申请允许          
                CommunicationErr = BUSENABLEERR;
                ConflictFlag |= HASLINKEDFLG;
                UartFlag = 0X8000;                  //接收指令并处理
                break;
             }
             else
             {
               UartCount++;
             }
           }                                    

         
         
            UartCount = 2;
            while((ReceviceBuff[UartCount] == ReceviceTable[2][UartCount]) 
                  && (UartCount < 9) && (UartFlag == 0X00))
            {                                          //收到是异常状态
              if(UartCount == 7) 
              {
                 while((IFG1 & UTXIFG0) == 0);                  
                 TXBUF0 = ReceviceBuff[0];
                 while((IFG1 & UTXIFG0) == 0 ) ; 
                 TXBUF0 = ReceviceBuff[0];
                 SendData(CodeTable[5], 7);             //异常灯点亮         
                 CommunicationErr = EMERGENCYONERR;
                 UartFlag = 0X8000;                     //接收指令并处理
                 break;                                                 
              }
              else 
              {
                UartCount++;                                          
              }
            }
         
            UartCount = 2;
            while((ReceviceBuff[UartCount] == ReceviceTable[3][UartCount]) 
                  && (UartCount < 9) && (UartFlag == 0X00))
            {                                          //收到是异常解除状态
              if(UartCount == 7) 
              {
                 while((IFG1 & UTXIFG0) == 0);                  
                 TXBUF0 = ReceviceBuff[0];
                 while((IFG1 & UTXIFG0) == 0 ) ; 
                 TXBUF0 = ReceviceBuff[0];
                 SendData(CodeTable[6], 7);             //异常灯点灭         
                 CommunicationErr = EMERGENCYOFFERR;
                 UartFlag = 0X8000;                  //接收指令并处理
                 break;                                                 
              }
              else 
              {
                UartCount++;                                          
              }
            }
          
          
            UartCount = 2;
            while((ReceviceBuff[UartCount] == ReceviceTable[4][UartCount]) 
                  && (UartCount < 9) && (UartFlag == 0X00))
            {                                           //收到是释放总线请求
              if(UartCount == 3) 
              {
                 _NOP(); _NOP(); _NOP();
                 SendData(CodeTable[2], 9);             //发送释放总线请求        
                 CommunicationErr = BUSFREEERR;
                 UartFlag = 0X8000;                     //接收指令并处理
                 break;                                                 
              }
              else 
              {
                UartCount++;                                          
              }
            }
          
            UartCount = 2;
            while((ReceviceBuff[UartCount] == ReceviceTable[5][UartCount])   //收到PLC
                  && (UartCount < 9) && (UartFlag == 0X00))
            {
              if(UartCount == 3) 
             {
                  switch(CommunicationErr)
                 {
                     case BUSENABLEERR:  
                       while((IFG1 & UTXIFG0) == 0);                  
                       TXBUF0 = ReceviceBuff[0];
                       while((IFG1 & UTXIFG0) == 0 ) ; 
                       TXBUF0 = ReceviceBuff[0];
                       SendData(CodeTable[1], 7);          //总线申请允许          
                       CommunicationErr = BUSENABLEERR;
                       break;
                     case EMERGENCYONERR:                                
                       while((IFG1 & UTXIFG0) == 0);                  
                       TXBUF0 = ReceviceBuff[0];
                       while((IFG1 & UTXIFG0) == 0 ) ; 
                       TXBUF0 = ReceviceBuff[0];
                       SendData(CodeTable[5], 7);             //异常灯点亮         
                       CommunicationErr = EMERGENCYONERR;
                       break;
                     case EMERGENCYOFFERR:  
                       while((IFG1 & UTXIFG0) == 0);                  
                       TXBUF0 = ReceviceBuff[0];
                       while((IFG1 & UTXIFG0) == 0 ) ; 
                       TXBUF0 = ReceviceBuff[0];
                       SendData(CodeTable[6], 7);             //异常灯点灭         
                       CommunicationErr = EMERGENCYOFFERR;
                       break;
                     case RESENDERR:                                
                       while((IFG1 & UTXIFG0) == 0);                  
                       TXBUF0 = ReceviceBuff[0];
                       while((IFG1 & UTXIFG0) == 0 ) ; 
                       TXBUF0 = ReceviceBuff[0];             //重发指令字
                       SendData(CodeTable[4], 2);            
                       break;
                     case BEQUIETERR:                       //总线繁忙         
                       UartCounter = 0;  
                       SendData(CodeTable[0], 6);                  
                       CommunicationErr = BEQUIETERR;
                       break;
                     case BUSFREEERR:                                   
                       SendData(CodeTable[2], 9);           //发送释放总线        
                       CommunicationErr = BUSFREEERR;
                       break;
                  }
                  UartFlag = 0X8000;                                  //接收指令并处理                    
                  break;                                               //跳出循环
              }
              else 
              {
                UartCount++;                                          
              }
            }
          

           if((UartFlag == 0X00)           //标志字不可确认,且建立了链接    
              &&((ConflictFlag & HASLINKEDFLG) == HASLINKEDFLG))      
           {
              while((IFG1 & UTXIFG0) == 0);                  
              TXBUF0 = ReceviceBuff[0];
              while((IFG1 & UTXIFG0) == 0 ) ; 
              TXBUF0 = ReceviceBuff[0];             
              SendData(CodeTable[4], 2);              //重发指令字
           }
           else if(UartFlag == 0X00)      //标志字不可以确认,没有建立链接
           {
              SendData(CodeTable[0], 6);                           //发送总线冲突指令字           
              CommunicationErr = BEQUIETERR;
              ConflictFlag |= TIMEOUTFLG;                          //定时超时标志
           }
        }
     }
   
     if((WatchRecevice >= 5) && (UartCounter > 9))   //接收到总线上的乱码                               //接收到总线上的乱码    
     {
        _DINT();
        TBCCTL0 &= ~CCIE;                                    //不允许定时器A中断
        WatchRecevice = 0;                                   //延时变量为0 
        UartCounter = 0;  
        SendData(CodeTable[0], 6);                           //发送总线冲突指令字           
        CommunicationErr = BEQUIETERR;
        ConflictFlag |= TIMEOUTFLG;                          //定时超时标志
        //_EINT();
        //return;
      }
     ConflictFlag |= TIMEOUTFLG;                                     //定时超时标志
     /*if((ConflictFlag & VANFLAG) == VANFLAG)
     {
       WatchRecevice = 6;
       UartCounter   = 9;
     }*/
     _EINT();
   }
    /*if((P6IN & P6IN_4) != P6IN_4)                          //如果掉电进入掉电处理        
   {
     Flag |= LowPowerFlg;
     DisplayFlg &= ~FirstFlg; 
     if((DisplayFlg & FirstFlg) == FirstFlg)
     {
        TACCTL0 &= ~CCIE;                                   //不允许定时器A中断
        TBCTL   = TBSSEL_1 + MC_1;                          //定时器B 32768HZ 中断
        TBCCTL0 = CCIE;                                     //定时器B 中断允许
        TBCCR0  = 32768;                                    //定时时间1s
        LPM3;
     }
   }*/
   
  
    
   /* if((Flag & ReceiveDataFlg) == ReceiveDataFlg)                        //接受上位机数据后,解包的处理
    {
      _DINT();
      unsigned char Counter;
      unsigned char ii=0;
      signed   char j=0;
      unsigned int  k=0;
      unsigned int  digital=0;
      CheckSum=0;
      for(ii=0; ii<9; ii++)
      {
        for(j=0; j<4; j++)
        {
          TotalProTemp[ii][j]=0;                                          //临时数组初始化
        }
      }
      while(ReceviceBuff[ii++] != '~') ;                                  //获取接收数据指令的长度
      j = 0;
      for(Counter=4; Counter<(ii-4); Counter++)                           //截取数据字符
      {
        CheckSum += ReceviceBuff[Counter];
        if((ReceviceBuff[Counter] != ','))                                //获取ASCII数据
        {            
          {
            TotalProTemp[k][j++] = ReceviceBuff[Counter];
          }
        }
        else
        {
          k++;
          j = 0;
        }
      }
      CheckSum += ReceviceBuff[3]; 
      CheckSum = CheckSum & 0X0F;                                             //校验和
      CheckSum |= 0X20;
      if(CheckSum == ReceviceBuff[ii-2])                                      //发送正确数据指令接收完毕
      {
        while((IFG1 & UTXIFG0) == 0);
        TXBUF0 = AddressIndex[SelfAddress];
        while((IFG1 & UTXIFG0) == 0);
        TXBUF0 = AddressIndex[SelfAddress];
        SendData(CorrectCode,2);
        UartCount = 0;
        Flag &= ~ReceiveDataFlg;
        for(ii=0; ii<10; ii++)
        {
          TotalPro[ii]=0;
        }
        
        for(ii=0; ii<9; ii++)                                                 //将ASCII数据转换成数值数据
        {
          Counter = 0;
          for(j=3; j>=0; j--)
          {
             switch(TotalProTemp[ii][j])
             {
                case '0':
                  Counter++;
                  digital = 0;
                  break;
                case '1':
                  Counter++;
                  digital = 1;
                  break;
                case '2':
                  Counter++;
                  digital = 2;
                  break;
                case '3':
                  Counter++;
                  digital = 3;
                  break;
                case '4':
                  Counter++;
                  digital = 4;
                  break;
                case '5':
                  Counter++;
                  digital = 5;
                  break;
                case '6':
                  Counter++;
                  digital = 6;
                  break;
                case '7':
                  Counter++;
                  digital = 7;
                  break;
                case '8':
                  Counter++;
                  digital=8;
                  break;
                case '9':
                  Counter++;
                  digital = 9;
                  break;
              }
          
              switch(Counter)
              {
                case 1:
                  k = 1;
                  TotalPro[ii+1] += digital * k;
                  break;
                case 2:
                 k = 10;
                 TotalPro[ii+1] += digital * k;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -