rfserver.c

来自「MCS51的实现无线接收发送(315M或433M)源程序代码。」· C语言 代码 · 共 579 行 · 第 1/2 页

C
579
字号
/**********************************************************
*                  RfServer.c                             *
**********************************************************/
#define RFSERVER_GLOBALS 
//=========================================================
#include "Os\Sm5964.h"
#include "Os\Struct.h"
#include "Os\Hardware.h"
#include "Os\Uart.h"
#include "Os\Tools.h"
#include "Os\Error.h"
#include "Os\OS.h"
#include "Os\TmrTsk.h"
#include "Os\TskMan.h"
#include "Os\Tmr2.h"
#include "Os\Int01.h"
#include "Config.h"
#include "ApplyStruct.h"
#include "RfServer.h"
//=========================================================
#define DEBUG_RFSERVER   1
//=========================================================
#define RFRECVDATABUFLEN       20
#define RFSENDDATABUFLEN       20
//=========================================================
#define FLAG1                  0XFF
#define FLAG2                  0XFE
//=========================================================
#define HOST                   0X01
#define SOSS                   0X02
#define AMU                    0X03
//=========================================================
#define IDSERIALLEN            4
//=========================================================
#define ADDR_IDENTITY          0X8000
#define ADDR_ID_SERIAL         0X8001
#define ADDR_AMU_NUM           0X8010
#define ADDR_HOST              0X8020
//=========================================================
#define AMUNORECV              18
//=========================================================
static INT8UX AmuNum,AmuNoRecvCnt,Status;
static INT8UX AmuData[10][5];
static INT8UX LoopIndex;
static INT8UX CurRecvIdSerial[IDSERIALLEN];

static INT8UX RfRecvDataBuf[RFRECVDATABUFLEN];
static INT8UX RfRecvDataLen;
static INT8UX RfSendDataBuf[RFSENDDATABUFLEN];
static INT8UX RfSendDataLen;
//=========================================================
static void RfServerTmrProc(void)
{
	  INT8U Identity;
	  
	  #if DEBUG_RFSERVER
	  //MDebugStrLF((INT8UC *)"RfServerTmrProc()");
	  #endif
	  
	  Identity=RdRom(ADDR_IDENTITY);
	  if(Identity==HOST)
	    {
	     if(LoopIndex<AmuNum)
	       {
	    	   AmuData[LoopIndex][4]=3; //处于通讯失败
	    	
	    	   RfSendDataLen=0;
	    	   RfSendDataBuf[RfSendDataLen++]=FLAG1;
	    	   MovXX(RfSendDataBuf+RfSendDataLen,AmuData[LoopIndex],IDSERIALLEN);
	    	   RfSendDataLen+=IDSERIALLEN;
	    	   MovCX(RfSendDataBuf+RfSendDataLen,(INT8UC *)ADDR_ID_SERIAL,IDSERIALLEN);
	    	   RfSendDataLen+=IDSERIALLEN;
	    	   RfSendDataBuf[RfSendDataLen++]=0X01;
	    	   RfSendDataBuf[RfSendDataLen++]=Status;
	    	   RfSendDataBuf[RfSendDataLen++]=GetChkSum(RfSendDataBuf+1,RfSendDataLen-1);
	    	   RfSendDataBuf[RfSendDataLen++]=FLAG2;
	       	#if DEBUG_RFSERVER
	        MDebugExMemHex(RfSendDataBuf,RfSendDataLen);
	        #endif
	    	   RfSend(RfSendDataBuf,RfSendDataLen);
	       }
	     if(++LoopIndex>=AmuNum) LoopIndex=0;
	     StartTmr(RFSERVERTMRID,SECOND5);
	    }
	  else if(Identity==AMU)
	    {
	     if(Status==0x40)
	       {
   	     RfSendDataLen=0;
	        RfSendDataBuf[RfSendDataLen++]=FLAG1;
	    	   MovCX(RfSendDataBuf+RfSendDataLen,(INT8UC *)ADDR_HOST,IDSERIALLEN);
   	     RfSendDataLen+=IDSERIALLEN;
	    	   MovCX(RfSendDataBuf+RfSendDataLen,(INT8UC *)ADDR_ID_SERIAL,IDSERIALLEN);
	    	   RfSendDataLen+=IDSERIALLEN;
	    	   RfSendDataBuf[RfSendDataLen++]=0X02;
	    	   RfSendDataBuf[RfSendDataLen++]=Status;
	    	   RfSendDataBuf[RfSendDataLen++]=GetChkSum(RfSendDataBuf+1,RfSendDataLen-1);
	    	   RfSendDataBuf[RfSendDataLen++]=FLAG2;
	        #if DEBUG_RFSERVER
	        MDebugStrLF((INT8UC *)"求救");
	        MDebugExMemHex(RfSendDataBuf,RfSendDataLen);
	        #endif
	    	   RfSend(RfSendDataBuf,RfSendDataLen);
	    	   
	        StartTmr(RFSERVERTMRID,SECOND10);
	       }
	    }
	  else if(Identity==SOSS)
	    {
      RfSend(RfSendDataBuf,RfSendDataLen);
	    }

}
//=========================================================
void InitRfServerTsk(void)
{
	  INT8U Identity;
	  
	  #if DEBUG_RFSERVER
	  MDebugStrLF((INT8UC *)"InitRfServerTsk()");
	  #endif
	  
	  Identity=RdRom(ADDR_IDENTITY);
	  
	  #if DEBUG_RFSERVER
	  MDebugPara("身份:",Identity);
	  MDebugCodeHex((INT8UC *)ADDR_ID_SERIAL,IDSERIALLEN);
	  #endif
	  
	  if(Identity==HOST)
	    {
	     Status=0;
	     LoopIndex=0;
	     AmuNum=0;
	     //AmuNum=RdRom(ADDR_AMU_NUM);
	     //MovCX((INT8UX *)AmuData,(INT8UC *)(ADDR_AMU_NUM+1),AmuNum*5);
	  
	     #if DEBUG_RFSERVER
	     MDebugPara("AmuNum:",AmuNum);
	     //MDebugExMemHex((INT8UX *)AmuData,AmuNum*5);
	     #endif
	  
	     InstallTmr(RFSERVERTMRID,RfServerTmrProc);
	     StartTmr(RFSERVERTMRID,SECOND5);
	    }
	  else if(Identity==SOSS)
	    {
	     InstallTmr(RFSERVERTMRID,RfServerTmrProc);
	    }
	  else if(Identity==AMU)
	    {
	     Status=0;
	     AmuNoRecvCnt=0;
	     InstallTmr(RFSERVERTMRID,RfServerTmrProc);
	     StartTmr(RFSERVERTMRID,SECOND5);
	    }
}
//=========================================================
void RfServerTskEntry(void)
{
	  #if DEBUG_RFSERVER
	  MDebugStrLF((INT8UC *)"RfServerTskEntry()");
	  #endif
}
//=========================================================
static void HdlRfFrame(void)
{
   INT8U i,Identity,*Data;

	  #if DEBUG_RFSERVER
	  //MDebugStrLF((INT8UC *)"HdlRfFrame()");
	  //MDebugExMemHex(RfRecvDataBuf,RfRecvDataLen);
	  #endif
	  
	  Identity=RdRom(ADDR_IDENTITY);
	  if(Identity==AMU)
	    {
	     if(CmpXCString(RfRecvDataBuf+1,(INT8UC *)ADDR_ID_SERIAL,IDSERIALLEN)!=STR_EQUAL)
	       {
	    	   #if DEBUG_RFSERVER
	        //MDebugStrLF((INT8UC *)"不是我的ID");
	        #endif
	        return;
	       }
	     if(CmpXCString(RfRecvDataBuf+1+IDSERIALLEN,(INT8UC *)ADDR_HOST,IDSERIALLEN)!=STR_EQUAL)
	       {
	    	   #if DEBUG_RFSERVER
	        //MDebugStrLF((INT8UC *)"不是我的中心");
	        #endif
	        return;
	       }
	     #if DEBUG_RFSERVER
	     //MDebugExMemHex(RfRecvDataBuf,RfRecvDataLen);
	     #endif
      Data=(INT8U *)(RfRecvDataBuf+1+IDSERIALLEN+IDSERIALLEN);
      switch(*Data)
        {
        	case 0x01:
	             AmuNoRecvCnt=0;
	             
	             Status=*(Data+1);
	             if(Status==0x40)
	               {
	               	#if DEBUG_RFSERVER
	                MDebugStrLF((INT8UC *)"HST触发报警");
	                #endif
	               }
	             else
	               {
	                #if DEBUG_RFSERVER
	                MDebugStrLF((INT8UC *)"HST查询状况");
	                #endif
	               }
	             
	         	   RfSendDataLen=0;
	    	        RfSendDataBuf[RfSendDataLen++]=FLAG1;
	    	       	MovCX(RfSendDataBuf+RfSendDataLen,(INT8UC *)ADDR_HOST,IDSERIALLEN);
	    	        RfSendDataLen+=IDSERIALLEN;
	    	        MovCX(RfSendDataBuf+RfSendDataLen,(INT8UC *)ADDR_ID_SERIAL,IDSERIALLEN);
	    	        RfSendDataLen+=IDSERIALLEN;
              RfSendDataBuf[RfSendDataLen++]=0X81;
              RfSendDataBuf[RfSendDataLen++]=Status;
	    	        RfSendDataBuf[RfSendDataLen++]=GetChkSum(RfSendDataBuf+1,RfSendDataLen-1);
	    	        RfSendDataBuf[RfSendDataLen++]=FLAG2;
	    	        #if DEBUG_RFSERVER
	             MDebugExMemHex(RfSendDataBuf,RfSendDataLen);
	             #endif
	    	        RfSend(RfSendDataBuf,RfSendDataLen);
     	        break;
     	        
        	case 0xc0:
     	        #if DEBUG_RFSERVER
	             MDebugStrLF((INT8UC *)"收到SOSS报警应答");
	             #endif

     	        break;
        }
   	 }
   	 
   else if(Identity==SOSS)
	    {
	     #if DEBUG_RFSERVER
	     //MDebugExMemHex(RfRecvDataBuf,RfRecvDataLen);
	     #endif
      Data=(INT8U *)(RfRecvDataBuf+1+IDSERIALLEN+IDSERIALLEN);
      if((*Data==0x02)&&(*(Data+1)==0x40))
        {
     	   #if DEBUG_RFSERVER
	        MDebugStrLF((INT8UC *)"收到求救信号");
	        #endif
	             
	        UartSendLen=0;
         UartSendBuf[UartSendLen++]=0X7F;
         UartSendBuf[UartSendLen++]=6;
         UartSendBuf[UartSendLen++]=0X0F;
	    	   MovXX(UartSendBuf+UartSendLen,RfRecvDataBuf+1+IDSERIALLEN,IDSERIALLEN);
	    	   UartSendLen+=IDSERIALLEN;
	    	   UartSendBuf[UartSendLen++]=GetChkSum(UartSendBuf+2,UartSendLen-2);
	    	   #if DEBUG_RFSERVER
	        //MDebugExMemHex(UartSendBuf,UartSendLen);
	        #endif
	    	   PostToUartSendQ(0);
	    	        
	        RfSendDataLen=0;
	    	   RfSendDataBuf[RfSendDataLen++]=FLAG1;
	    	   MovXX(RfSendDataBuf+RfSendDataLen,RfRecvDataBuf+1+IDSERIALLEN,IDSERIALLEN);
	    	   RfSendDataLen+=IDSERIALLEN;
	    	   MovCX(RfSendDataBuf+RfSendDataLen,(INT8UC *)ADDR_ID_SERIAL,IDSERIALLEN);
	    	   RfSendDataLen+=IDSERIALLEN;
         RfSendDataBuf[RfSendDataLen++]=0XC0;
	    	   RfSendDataBuf[RfSendDataLen++]=GetChkSum(RfSendDataBuf+1,RfSendDataLen-1);
	    	   RfSendDataBuf[RfSendDataLen++]=FLAG2;
	    	   #if DEBUG_RFSERVER
	        MDebugExMemHex(RfSendDataBuf,RfSendDataLen);
	        #endif
	             
	        //StartTmr(RFSERVERTMRID,2);
        }
   	 }
   else if(Identity==HOST)
	    {
	     if(CmpXCString(RfRecvDataBuf+1,(INT8UC *)ADDR_ID_SERIAL,IDSERIALLEN)!=STR_EQUAL)
	       {
	    	   #if DEBUG_RFSERVER
	        MDebugStrLF((INT8UC *)"不是我的ID");
	        #endif
	        return;
	       }
	     for(i=0;i<AmuNum;i++)
	       {

⌨️ 快捷键说明

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