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 + -
显示快捷键?