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

📄 main.c

📁 在飞思卡尔MC9S08GB60单片机环境下实现了无线监控
💻 C
📖 第 1 页 / 共 3 页
字号:
   UINT8 k=0;	  
   //XorResult为收到的数据校验位
   char XorResult = CheckXor(rx_packet_rx->dataLength,SciRxBufZb);
   
   if (rx_packet_rx->status != SUCCESS){//接收数据不成功
     commu_watchdog++;//看门狗计数+1,说明接收数据不成功,未能收到完整的数据
     if(commu_watchdog==3){//看门狗计数到3,认为是座机和子机之间通信有问题
       COMMU_ERROR_Flag = 1;
     }  
     return; 
   }
   if (rx_packet_rx->status == SUCCESS){    
     if (XorResult == 0){ //检测校验位是否正确,如果校验正确,接着检查其他信息
       commu_watchdog++; //看门狗计数+1,说明校验位不正确,否则应为0
       if(commu_watchdog==3){//看门狗计数到3,认为是座机和子机之间通信有问题
         COMMU_ERROR_Flag = 1;
       }
       return;
     } 
     if(XorResult==1){
       commu_watchdog=0;
     /**************先检验有没有子机丢失*****************************/
      //j=k=0;
      for(j=0;j<SlaveNumber;j++){
        for(k=0;k<17;k++)  {
          if((rx_data_buffer.TAG[k].Mac_AddL!=0xFF)&&Slave_Ram_Buff[j].SlaveID==rx_data_buffer.TAG[k].Mac_AddL){
            Slave_Ram_Buff[j].Status = 0;
            break;
          }
          if((k==16&&(rx_data_buffer.TAG[k].Mac_AddL!=0xFF))&&Slave_Ram_Buff[j].SlaveID!=rx_data_buffer.TAG[k].Mac_AddL){
            if(Slave_Ram_Buff[j].lost_finishflag==0){
              Slave_Ram_Buff[j].lost_count++;
            }
          }
          if((rx_data_buffer.TAG[k].Mac_AddL!=0xFF)&&Slave_Ram_Buff[j].lost_count==3){
            Slave_Ram_Buff[j].Status = LOST_ALARM;
            LOST_NUM++;
            LOST_Flag=1;
          }
        }  
      }
       
      /****************接着验证是否有移动或者电压低*******************/   
      for (i = 0;i<SlaveNumber;i++){
    	  if(((commu_watchdog<3)&&(rx_data_buffer.TAG[i].Mac_AddL!=0xFF))&&((rx_data_buffer.TAG[i].Check_SlaveH & 0xC0)==0xC0)){
        //子机的P3.1和P3.0 管脚均为高,说明子机正常,C0正常,其他值均不正常          
         for(j=0;j<SlaveNumber;j++){
          if(Slave_Ram_Buff[j].SlaveID==rx_data_buffer.TAG[i].Mac_AddL){
            Slave_Ram_Buff[j].move_count=0;
            Slave_Ram_Buff[j].low_batt_count=0;
            break;
          }
         }
    	  }
        if((commu_watchdog<3)&&((rx_data_buffer.TAG[i].Check_SlaveH & 0x40))==0x00){
         //检查子机P3.1管脚是否为低,即是否是低电压,40正常,00异常
          for(j=0;j<SlaveNumber;j++){
           if((rx_data_buffer.TAG[i].Mac_AddL!=0xFF)&&(Slave_Ram_Buff[j].SlaveID==rx_data_buffer.TAG[i].Mac_AddL)){
            if(Slave_Ram_Buff[j].low_batt_finishflag==0){
              Slave_Ram_Buff[j].low_batt_count++; 
            }
            if(Slave_Ram_Buff[j].low_batt_count==3){
              Slave_Ram_Buff[j].Status = POWER_ALARM;
              LOW_BATT_NUM++;
              LOW_BATT_Flag=1;
            } break;  
           }
          }
        }
        if((commu_watchdog<3)&&((rx_data_buffer.TAG[i].Check_SlaveH & 0x80))==0x00){
         //检查子机P3.0管脚是否为低,即是否被移动,80正常,00异常
         for(j=0;j<SlaveNumber;j++){
          if((rx_data_buffer.TAG[i].Mac_AddL!=0xFF)&&(Slave_Ram_Buff[j].SlaveID==rx_data_buffer.TAG[i].Mac_AddL)){
            if(Slave_Ram_Buff[j].move_finishflag==0){
              Slave_Ram_Buff[j].move_count++; 
            }
            if(Slave_Ram_Buff[j].move_count==3){
              Slave_Ram_Buff[j].Status = MOVE_ALARM;
              MOVE_NUM++;
              MOVE_Flag=1;
            } break;   
          } 
         }
        }
      }
     }
      if(commu_watchdog==3){//看门狗计数到3,认为是座机和子机之间通信有问题
        COMMU_ERROR_Flag = 1;
        return;
      }
   }
}

	 	 


/**************************************************************
*	Function: 	ProcessReceiveDataLoop()
*	Parameters: none
*	Return:		none
*	Actions:	检测接收到的需要处理的子机命令类型标志位,做出相应的
*           处理      
**************************************************************/

void ProcessReceiveDataLoop(void)	 
{

   UINT8  i = 0;
   UINT8  j = 0;	 
	 Feed_HardDog();
	 ReadFlash(SLAVE_ID);
	 
	 if(SlaveNumber) 
	  {	  
	   for(i=0;i<15;i++)
	     {
	      if(FLASHBUFFER[i]!=0xFF){
	       Slave_Ram_Buff[i].SlaveID=FLASHBUFFER[i];
	       Flag_P = 1;
	      }
	     }
	  }
	 else	 //复位后第一轮且PC未配置子机ID
	  {
	    for(i=0;i<15;i++)
	     {
	      if(FLASHBUFFER[i]!=0xFF){
	       Slave_Ram_Buff[i].SlaveID=FLASHBUFFER[i];
	       Flag_P = 1;
	       SlaveNumber++;
	      }
	     }
	  }
	 
	 if(Flag_P){
	    
	   Data_Evalate(); //将串口得到的子机信息复制到
	   //Feed_SoftDog();					//喂软狗
	   Check_data_indication(&rx_packet);
     //SciRxPtr=0;
   
     //处理各种情况
     //子机被移动的情况
     if(MOVE_Flag == 1){
       for(j=0;j<SlaveNumber;j++){
  	     if(Slave_Ram_Buff[j].Status==MOVE_ALARM){      
  	         Move_DeviceID = Slave_Ram_Buff[j].SlaveID;
  	         Slave_Ram_Buff[j].move_count=0;
  	         MOVE_NUM--;
  	         WriteAlarm(Move_DeviceID,MOVE_ALARM); //将报警信息写进flash中 
  	     	   Slave_Ram_Buff[j].Status=0;
  	     	   Slave_Ram_Buff[j].move_finishflag=1;
  	     }
    	 } 
    	 MOVE_Flag=0;
    	 Move_DeviceID=0;	  
       BELL=0;
     }

     //子机低电压的情况
     if(LOW_BATT_Flag == 1){
       for(j=0;j<SlaveNumber;j++){
    	   if(Slave_Ram_Buff[j].Status==POWER_ALARM){     
    	       Low_DeviceID = Slave_Ram_Buff[j].SlaveID;
    	       Slave_Ram_Buff[j].low_batt_count=0;
    	       LOW_BATT_NUM--;
    	       WriteAlarm(Low_DeviceID,POWER_ALARM); //将报警信息写进flash中 
    	   	   Slave_Ram_Buff[j].Status=0;
    	   	   Slave_Ram_Buff[j].low_batt_finishflag=1;
  	     }
  	   } 
    	 LOW_BATT_Flag=0;
    	 Low_DeviceID=0; 
    	 Slave_Ram_Buff[j].low_batt_count=0;
       BELL=0;
     }
    
   
     //子机丢失报警 
     if(LOST_Flag == 1){
    	 for(j=0;j<SlaveNumber;j++){
    	   if(Slave_Ram_Buff[j].Status==LOST_ALARM){  
    	       LOST_DeviceID = Slave_Ram_Buff[j].SlaveID;
    	       Slave_Ram_Buff[j].lost_count=0;
    	       LOST_NUM--;
    	       WriteAlarm(LOST_DeviceID,LOST_ALARM); //将报警信息写进flash中 
  	     	   Slave_Ram_Buff[j].Status=0;
  	     	   Slave_Ram_Buff[j].lost_finishflag=1;
  	     }
    	 } 
    	 LOST_Flag=0; 
    	 LOST_DeviceID=0;
    	 Slave_Ram_Buff[j].lost_count=0;
       BELL=0;
     }
	 
      //子机和主机通信有问题报警 
      if(COMMU_ERROR_Flag != 1){
        CommuErrorCount=0;
      }
      if(COMMU_ERROR_Flag == 1){
        CommuErrorCount++;
    	  //清标志位
        COMMU_ERROR_Flag = 0;
        commu_watchdog = 0;
        //IO口输出0令ZIGBEE模块reset
				PTAPE_PTAPE2=0;
      }   
      if(CommuErrorCount==3){
        BELL=1;
        CommuErrorCount=0;
        if(commu_error_finishflag==0){
          WriteAlarm(MASTERID,MASTER_ALARM);
          commu_error_finishflag=1;
        }
      } 
      
      //主机交流电掉电
      if(MasterPower_Flag == 1)
        {
        	 if(Master_Ram_Buff.mspower_finishflag==0){
        	  WriteAlarm(MASTERID,MASTER_POWER_ALARM); //将报警信息写进flash中
        	  MasterPower_Flag = 0;
        	  Master_Ram_Buff.mspower_finishflag=1;
        	 }
        }
      
      //累计轮询一轮时间到,检查Flash中是否有报警信息并发短信打电话报警
      
      //Feed_SoftDog();					//喂软狗
      

      if(first==1) //上一次报警电话和报警短信已经处理完毕,现在可以处理第二批了
        {                    
          
          AlarmFlashStatistic();

          if(((((LostCount!=0)||(PowerCount!=0))||(MoveCount!=0))||(MasterCount!=0))||(MasterPowerLoss!=0)) 
            {
              LED10ON();//指示现在处于报警状态
              GoTime = 1;//让TC35i开始工作
            }
        }
			if(GoTime==1)								//指示中文短信的AT命令
			  {
           GoTime =0;
           MessagePrepare();
           first = 0;
           PrepareTimeFlag =1;
			  }
			if(PrepareTime==1)				 //具体的中文短信内容
			  {												 //里面的第一层if里面的判断条件(GoTimeFlag == 0)用来避免对所有子机发完一轮短信后,顺序执行下一个if
			  	 if((LostCount!=0)&&(GoTimeFlag == 0)) 	 //如果有丢失子机,填丢失短信的包
             {                  
                PrepareTime =0;
                MessageGo(LOST_ALARM,CellPhone);
                CellPhone++;
                if(CellPhone==4)
                  {
                  	 CellPhone=1;
                  	 LostCount=0;
                     if((((PowerCount==0)&&(MoveCount==0))&&(MasterCount==0))&&(MasterPowerLoss==0))//没有报警了
                       {                     
                         HangTimeFlag=1;
                       }
                     else
                       {
                         GoTimeFlag =1;
                       }
                  }
                else
                  {
                     GoTimeFlag =1;
                  } 
                }
        
			  	 if(((LostCount==0)&&(PowerCount!=0))&&(GoTimeFlag == 0))  //如果没有丢失子机,有子机掉电,填掉电短信的包
             {                  
                PrepareTime =0;
                MessageGo(POWER_ALARM,CellPhone);
                CellPhone++;
                if(CellPhone==4)
                  {
                  	 CellPhone=1;
                  	 PowerCount=0;
                     if(((MoveCount==0)&&(MasterCount==0))&&(MasterPowerLoss==0))//没有报警了
                       {                      
                         HangTimeFlag=1;
                       }
                     else
                       {
                         GoTimeFlag =1;
                       }
                  }
                else
                  {
                     GoTimeFlag =1;
                  }

             }

			  	 if((((LostCount==0)&&(PowerCount==0))&&(MoveCount!=0))&&(GoTimeFlag == 0))  //如果没有丢失子机,没有子机掉电,有子机移动,填移动短信的包
             {                  
                PrepareTime =0;
                MessageGo(MOVE_ALARM,CellPhone);
                CellPhone++;
                if(CellPhone==4)
                  {
                  	 CellPhone=1;
                  	 MoveCount=0;
                     if((MasterCount==0)&&(MasterPowerLoss==0))//没有报警了
                       {
                         HangTimeFlag=1;
                       } 
                     else
                       {
                       	 GoTimeFlag = 1;
                       }
                  } 
                else
                  {
                     GoTimeFlag =1;
                  }
             }
			  	 
			  	 if(((((LostCount==0)&&(PowerCount==0))&&(MoveCount==0))&&(MasterCount!=0))&&(GoTimeFlag == 0))  //如果没有丢失子机,没有子机掉电,没有子机移动,有主机故障,填主机故障短信的包
             {                  
                PrepareTime =0;
                MessageGo(MASTER_ALARM,CellPhone);
                CellPhone++;
                if(CellPhone==4)
                  {
                  	 CellPhone=1;
                  	 MasterCount=0;
                     if(MasterPowerLoss==0)//没有报警了
                     	 {                     	  
                         HangTimeFlag=1;
                     	 } 
                     else
                       {
                     	 	 GoTimeFlag = 1;
                     	 }
                  } 
                else
                  {
                     GoTimeFlag =1;
                  }
             }

			  	 if((((((LostCount==0)&&(PowerCount==0))&&(MoveCount==0))&&(MasterCount==0))&&(MasterPowerLoss!=0))&&(GoTimeFlag == 0))  //如果没有丢失子机,没有子机掉电,没有子机移动,没有主机故障,有主机掉电,填主机掉电短信的包
             {                  
                PrepareTime =0;
                MessageGo(MASTER_POWER_ALARM,CellPhone);
                CellPhone++;
                if(CellPhone==4)
                  {
                  	 CellPhone=1;
                  	 MasterPowerLoss=0;
                     HangTimeFlag=1;
                  } 
                else
                  {
                     GoTimeFlag =1;
                  }
             } 
			  }
		
			if(HangTime==1) 
			  {
			  			  HangTime=0;
			  	      DialCellPhone(CellPhone);
			  	      
			  	      CellPhone++;
			  	      if(CellPhone==4) 
			  	        {
			  	        	 CellPhone =1; //下一个统计时间到来以后再用
			  	        }
			  	 
                RingTimeFlag =1;
			  }
			if(RingTime==1) 
			  {
			  				RingTime=0;
                HangUpCellPhone();
               
                if(CellPhone!=1) 
                  {
                    HangTimeFlag =1;
                  } 
                else
                  {
                    first = 1; //再发AT指令肯定是下轮的第一次
                  }							
			  }     
      }
}


/***************************************************************
*	Function: 	SlaveIsInFlash
*	Parameters: SlaveID
*	Return:		yes,return 1;  no,renturn 0
*	Actions: 判断收到的子机ID是否在FLASH1中,是的话操作
***************************************************************/

UINT8  SlaveIsInFlash(UINT8 SlaveID)
 {
    UINT8 Flag = 0;
    UINT8 Number = 0;
    UINT8 i;    
    Number = SlaveNumber;
    for(i=0;i<Number;i++){
      if(Slave_Ram_Buff[i].SlaveID == SlaveID) {
         Flag = 1;
         return 1;
         break; 
      }
    }
    if(Flag == 0) return 0;         
 }  

⌨️ 快捷键说明

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