📄 main.c
字号:
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 + -