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

📄 dvs-comprotoc.c

📁 电话报警主机AT89S52单片机并带有网络模块通信协议
💻 C
📖 第 1 页 / 共 2 页
字号:
//dvs-comprotoc.c
#include "DVS-V1.0.H"


//=========================================== 函数定义 ==========================================
void ScanComProtoc();																//扫描串口协议	
void RxTCPSame(unsigned char auc_Command,unsigned char auc_Send_Len,unsigned char *pDst);//返回协议	
void judgeRAYTC(unsigned char auc_Command,unsigned char auc_Send_Len,unsigned char *pDst);		
//===============================================================================================


//=========================================== 外部定义 ==========================================
//位
extern bit guc_Bit_BuChe;															//布撤防:1为布,0为撤
extern bit guc_bitRsCom;															//中断接收完毕

extern bit guc_bit_SenAlar ;														//传感器报警
extern bit guc_BitTel ; 															// 拔打电话标致位
//变里
extern unsigned int  data 	guc_Timer0;												//拔号按键定时计数器
extern unsigned char data  guc_AlarCnt;												//拔号时计算器
//数组
extern unsigned char idata RsBuf[32];												//接收缓冲区
//函数
extern void Delay1Ms(unsigned int auc_time);										//延时1MS
extern void ONAlarSoun();															//打开警号声
extern void BuFan();																//布防处理
extern void CheFan();																//撤防处理
extern void SendToData(unsigned char *p,unsigned char Long);						//发送命令
extern void SendASC(unsigned char ASC);												//发送-个ASCII
extern void WrEEPROM(unsigned char address,unsigned char indata);					//写EEPROM
extern unsigned char RdEEPROM(unsigned char address);								//读EEPROM
//===============================================================================================




//===============================================================================================
//语法格式: RxTCPSame()	
//实现功能: 返回相同的协议
//参数:		
//auc_Command:命令字;auc_Send_Len数据长度;*pDst:数据
//返回:		无
//创建时间:2008-12-26          修改时间:
//创建人员:                    修改人员:
//===============================================================================================
void RxTCPSame(unsigned char auc_Command,unsigned char auc_Send_Len,unsigned char *pDst)
{
	unsigned char data luc_i,luc_temp;
	luc_temp = 0xfe^auc_Command^0x00^0x01^auc_Send_Len;							//异或协议区
	for(luc_i = 0 ; luc_i < auc_Send_Len ;luc_i ++)								//异或数据区
	{
		luc_temp = *(pDst+luc_i)^luc_temp;
	}
	SendASC(0xfe);																//返回起始码
	SendASC(auc_Command);														//返回命令字
	SendASC(0x00);																//返回分包标记
	SendASC(0x01);																//返回命令序号
	SendASC(auc_Send_Len);														//返回数据区长度
	SendToData(pDst,auc_Send_Len);												//返回数据区
	SendASC(luc_temp) ;															//返回异或值
}



//===============================================================================================
//语法格式:	judgeRAYTC()	
//实现功能: 判断返回协议是否定义协议相同
//参数:		
//auc_Command:命令字;auc_Send_Len数据长度;*pDst:数据
//返回:		无
//创建时间:2009-01-08          修改时间:
//创建人员:                    修改人员:
//==============================================================================================
void judgeRAYTC(unsigned char auc_Command,unsigned char auc_Send_Len,unsigned char *pDst)
{
//	unsigned char data luc_i;
	RxTCPSame(auc_Command,auc_Send_Len,pDst);
	guc_Timer0 = 32;														//定时1秒
	while(1)																//等待回返回信息
	{
		if(RsBuf[0]==0xFE)
		{
			Delay1Ms(30);
			break;
		}
		if(guc_Timer0==0) break;											//如果没有等到返回信息也返回
	}
	RsBuf[0] = 0x00;
//	for(luc_i = 0 ; luc_i < 30 ; luc_i ++)									//清除接收缓冲区
//	{
//		RsBuf[luc_i] = 0x00;
//	}
	guc_bitRsCom = 0;
}


/*
//===============================================================================================
//语法格式:	judgeTCPSame()	
//实现功能: 判断协议是否定义协议相同
//参数:		无
//返回:		如果相同返回1,如果不同返回0
//创建时间:2008-12-25          修改时间:
//创建人员:                    修改人员:
//===============================================================================================
unsigned char judgeTCPSame()
{
	unsigned char data luc_len,luc_xordata;
	unsigned char data luc_temp,luc_i;
	luc_len = RsBuf[4];															//获取数据长度
	luc_xordata = RsBuf[4+luc_len+1];											//获取校验值
	luc_temp = RsBuf[0]^RsBuf[1]^RsBuf[2]^RsBuf[3]^RsBuf[4];					//异或协议值区
	for(luc_i = 0 ; luc_i < luc_len ;luc_i ++)									//异或数据区
	{
		luc_temp = RsBuf[5+luc_i]^luc_temp;
	}
	if((luc_xordata==luc_temp )&&(RsBuf[2]==0)&&(RsBuf[3]==1))	return 1;		//如果相同则返回1
	else
	{
	//	luc_len = 0x02;															//返回参数的数据长度错误
	//	RxTCPSame(RsBuf[1],1,&luc_len);
		return 0 ;																//否则返回0
	}
}
*/



//===============================================================================================
//语法格式: SetComPhone()	
//实现功能: 设置串口电话号码
//参数:		无
//返回:		无
//创建时间:2008-12-26          修改时间:
//创建人员:                    修改人员:
//===============================================================================================
void SetComPhone()
{
	unsigned char data luc_Phone_nub;
	unsigned char data luc_temp;
	unsigned char data luc_i;
	bit luc_BitOk;
	luc_Phone_nub = RsBuf[5];														//获取电话组数
	luc_temp = RsBuf[0]^RsBuf[1]^RsBuf[2]^RsBuf[3]^RsBuf[4]^RsBuf[5];



	for(luc_i = 0 ; luc_i < RsBuf[4]-1; luc_i ++)
	{
		if((RsBuf[luc_i+6])<13) luc_BitOk = 1; 
		else 
		{
			luc_BitOk = 0 ;
			break;
		}
	}





	if((luc_temp==RsBuf[6])||(luc_BitOk==0))										//如果相等则删除电话号码
	{
		luc_i = 0x00;
		RxTCPSame(SET_COM_PHONE,1,&luc_i);											//返回网络模块成功设置
		for(luc_i = 0 ; luc_i < PH_CODE_LEN; luc_i ++)
		{
			WrEEPROM(STER_ADDR+PH_CODE_LEN*(luc_Phone_nub)+luc_i,0xff);				//保存电话号码
		}
	}



	else
	{
		//ALARM_LED = 0;

		luc_i = 0x00;
		RxTCPSame(SET_COM_PHONE,1,&luc_i);											//返回网络模块成功设置
		WrEEPROM(STER_ADDR+PH_CODE_LEN*(luc_Phone_nub),'F');						//保存开始标致
		for(luc_i = 0 ; luc_i < RsBuf[4]-1; luc_i ++)
		{
			WrEEPROM(STER_ADDR+PH_CODE_LEN*(luc_Phone_nub)+luc_i+1,RsBuf[luc_i+6]);//保存电话号码
		}
		WrEEPROM(STER_ADDR+PH_CODE_LEN*(luc_Phone_nub)+luc_i+1,0xff);				//最后位加0xff结束标致
	}
}


//===============================================================================================
//语法格式: QueriesComPhone()
//实现功能: 查询串口电话号码
//参数:		无
//返回:		无
//创建时间:2008-12-26          修改时间:
//创建人员:                    修改人员:
//===============================================================================================
unsigned char code SendCom_TAB[5]={0xfe,0x81,0x00,0x01,0x00};
void QueriesComPhone()
{
	unsigned char idata luc_Buf[PH_CODE_LEN+2];
	unsigned char idata luc_i,luc_j;
	unsigned char data luc_temp ; 
							
	SendToData(SendCom_TAB,5);						// 发送命令头
	for(luc_j = 0 ; luc_j < 9 ; luc_j ++)
	{		
		for(luc_i=0 ;luc_i<PH_CODE_LEN;luc_i++)
		{
			luc_Buf[luc_i] = 0xff ; 
		}
		luc_temp = RdEEPROM(STER_ADDR+PH_CODE_LEN*(luc_j));
		if(luc_temp=='F')
		{
			for(luc_i=0  ; luc_i<PH_CODE_LEN - 1 ; luc_i++)
			{
				luc_Buf[luc_i] = RdEEPROM(STER_ADDR+PH_CODE_LEN*(luc_j)+luc_i+1);
				if(luc_Buf[luc_i]==0xff) break ;
				if((luc_Buf[luc_i])>=13) luc_Buf[luc_i] = 0xff ;
			}
		}
		SendToData(luc_Buf,PH_CODE_LEN);								// 发送电话号码
	}
}


⌨️ 快捷键说明

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