📄 dvs-comprotoc.c
字号:
//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 + -