?
程序不美, 不来一一整理了。 以后有时间可以把这个功能封装为一个类的对象来操作。即使不封装为类,至少也该封装为一个独立的函数吧。。。
关键代码摘要如下:
?
if( GetSecFlag(bit0) ) // 秒标志
{
ClrSecFlag(bit0);
sG_Global.wakeup_agagin++;
// 同步事件,记为事件A :同步超时,唤醒一次
if( sG_Global.syncState==ST_SYNC_OK )
{
sG_Global.SyncFail_Times = 0;
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
if( ++sG_Global.syncRunCnt> REVISE_TIME ) ? // 每次同步后计时, 进入这里是超时了
{
sG_Global.syncState = ST_SYNC_NULL;? // 切换为 未同步状态
WirelessWakeUp(62);? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?// 同时,打开设备,进行一次同步
sG_Global.wakeup_agagin = 0;? ? ?
sG_Global.syncRunCnt = 0;
}
}
// 如果上述事件A发生:无线模块唤醒后, 又没收到同步信号,也即是说 同步失败了。 那么进入下面的处理:
// sG_Global.wakeup_agagin每次同步后会清0, 用于记录已经多久没同步了。
if( sG_Global.SyncFail_Times <= 3) // 失败3次以内
{
// 防止REVISE_TIME后未收到时间信号后崩溃。 所以再次打开接收。
if(sG_Global.wakeup_agagin>= ( REVISE_TIME+120 ) )? // 这里应该是REVISE_TIME + 13 + 120 ?
{
sG_Global.SyncFail_Times++;
sG_Global.wakeup_agagin = 0;
WirelessWakeUp(62); // 每次唤醒如果同步,将清0 sG_Global.SyncFail_Times
}
}
else // sG_Global.SyncFail_Times<=3,即大约7*3 = 21分钟以后, 就每小时才同步一次。
{
if(sG_Global.wakeup_agagin>= 3600 )
{
sG_Global.SyncFail_Times++;
sG_Global.wakeup_agagin = 0;
WirelessWakeUp(62);
if(sG_Global.SyncFail_Times>100) // 100次 .中的后97次是1小时一次。所以一个周期:100次同步失败的总时间是97小时+大概21分钟左右了。
sG_Global.SyncFail_Times = 0; // 再回到下一个周期: 前3次同步失败, 失败后的420秒即每七分钟再同步一次。
}
}
}