📄 scom.c
字号:
#endif
#else /* EnPGFENGJI */
TIMSK2 = (u8)(1 << OCIE2A);
#endif /* EnPGFENGJI */
//ScFlag = 0; /* 清除所有标志 */
//SetTxD(); /* 准备接收 */
//ScAddrErrCnt = 0;
}
/*---------------------------------------------------------------------------*/
void ScCom_Sub(void)
{
u8 i;
u8 j;
#ifdef MONITOR
if (ScState == 1){ /* 查看数据状态 */
i = 0;
while ((i < 18) &&
(WaiJiCanShu[i] == WaiJiShuJu[i])) i++;
if (i < 18){
ScState = 2;
ScRepCount = 0; /* 如果数据被修改,启动数据发送 */
}
}
#endif
if (ValBit(ScFlag,fScRxOk)){ /* 1: 接收Ok */
if ((ScByteCnt != 0) &&
((ScBufAdr[0]|ScBufAdr[1]) == 0x0FF) &&
((ScBufAdr[2]|ScBufAdr[3]) == 0x0FF) &&
((ScBufAdr[4]|ScBufAdr[5]) == 0x0FF)){ /* 校验数据 */
ScMonCnt = 0; /* 与外机通信故障计时 */
ClrBit(Errorflg,fSComErr); /* 1:与外机通信故障 */
if (ScBufAdr[0] == 0x5A){ /* 外机发送 */
if (!ValBit(Errorflg,fRsAddrErr)){ /* 内机地址冲突时不处理任何命令 */
OutSideErr = (u8)(ScBufAdr[4] >> 2); /* 外机故障代码 */
i = (u8)(RunMode & 0x03);
if (i >= 0x02){ /* 制冷、除湿 */
i = 0x01;
} else if (i == 0x01){ /* 制热 */
i = 0x02;
}
/* 化霜标志 */
ClrBit(OutDevStu,fOutDeforst);
if ((j = (u8)(ScBufAdr[4] & 0x03)) == 0x03){
j = 0x02; /* 制热 */
SetBit(OutDevStu,fOutDeforst);
}
if ((!ValBit(RunMode,fSysOn)) || /* 关机时允许 */
((i | j) != 0x03)){ /* 模式与外机模式一致时允许 */
SetBit(OutDevStu,fRunEnable);
} else {
ClrBit(OutDevStu,fOutDeforst);
ClrBit(OutDevStu,fRunEnable);
}
/* 在模式没有发送到外机之前,先清除允许标志 */
if (!ValBit(Sysflag,fModeflag)){
ClrBit(OutDevStu,fRunEnable);
ClrBit(OutDevStu,fOutDeforst);
}
//if (ValBit(OutDevStu,fRunEnable)) ClrBit(Sysflag,fRequest);
if ((ScByteCnt == 6) &&
((ScBufAdr[2] & 0x3F) == NeijiNo)){ /* 风口控制器 */
ScComTx_Sub(); /* 准备发送数据 */
OCR2A = (u8)(TCNT2 + 8192/32); /* 间隔时间(8.192mS) */
SetTxD(); /* 发送准备 */
ScFlag = (1<<fScTx)|(1<<fScTxLo); /* 清除所有标志 */
#ifdef MONITOR
} else if ((ScByteCnt == 30) &&
((ScBufAdr[2] & 0x0F) == 0x00)){ /* 显示参数, 不应答 */
i = 6;
while ((i < 30) &&
((ScBufAdr[i]|ScBufAdr[i + 1]) == 0x0FF)) i += 2;
if (i >= 30){
for(i = 0; i < 12; i++){ /* 转存显示参数 */
XianShiCanShu[i] = ScBufAdr[6 + (i << 1)];
}
}
} else if ((ScByteCnt == 42) &&
((ScBufAdr[2] & 0x30) == 0x30)){ /* 外机参数, 不应答 */
i = 6;
while ((i < 42) &&
((ScBufAdr[i]|ScBufAdr[i + 1]) == 0xFF)) i += 2;
if (i >= 42){
for(i = 0; i < 18; i++){ /* 转存外机参数 */
WaiJiCanShu[i] = ScBufAdr[6 + (i << 1)];
}
if (ScState == 0){
ScState = 1; /* 完成数据读,进入正常模式 */
for(i = 0; i < 18; i++){ /* 转存外机参数 */
WaiJiShuJu[i] = WaiJiCanShu[i];
}
} else if (ScState == 3){
i = 0;
while ((i < 18) &&
(WaiJiCanShu[i] == WaiJiShuJu[i])) i++;
if (i >= 18){
ScState = 1; /* 数据校验成功,进入正常模式 */
//ScRepCount = 0;
} else {
ScState = 2; /* 数据校验不成功,再次发送 */
if (++ScRepCount >= ScRepCountMax) ScState = 0;
}
}
}
#endif /* MONITOR */
}
}
} else if (ScBufAdr[0] == 0x0A5){
/* 收到与本机地址相同的应答帧,则认为有内机地址冲突 */
if ((ScBufAdr[2] & 0x0f) == NeijiNo){
ScAddrErrCnt = 0;
SetBit(Errorflg,fRsAddrErr);
}
if (!ValBit(Errorflg,fRsAddrErr)){ /* 内机地址冲突时不处理任何命令 */
if ((ScByteCnt == 6) &&
(((ScBufAdr[2] & 0x0Bf) == 0x9f) ||
((ScBufAdr[2] & 0x0Bf) == 0x0af))){ /* A 型线控器发送 */
if ((ScBufAdr[4] >> 4) == NeijiNo){
if (ValBit(ScBufAdr[2],6)){
SetBit(SysConfig,fDisHeat); /* 1: 外机辅助电加热无效 */
} else {
ClrBit(SysConfig,fDisHeat); /* 0: 外机辅助电加热有效 */
}
i = (u8)(ScBufAdr[4] & 0x0f);
if (i == 0){
ClrBit(RunMode,fSysOnOff); /* 关机 */
ClrBit(RunMode,fSysOn);
ClrBit(Sysflag,fMAuto); /* 自动模式清除 */
//ClrBit(SlpTmFlag,fSleep); /* 清除睡眠和定时 */
//ClrBit(SlpTmFlag,fTimeOff);
} else {
SetBit(RunMode,fSysOnOff); /* 开机 */
//ClrBit(SlpTmFlag,fTime);
if (i == 1){
/* 制冷 */
SetMode(MODECOOL);
} else if (i == 2){
/* 制热 */
SetMode(MODEHEAT);
} else if (i == 4){
/* 通风 */
SetMode(MODEFAN);
} else if (i == 5){
/* 除湿 */
SetMode(MODEDRY);
} else {
/* 自动 */
SetMode(MODEAUTO);
}
}
}
#ifdef MONITOR
} else if (ScByteCnt > 6){ /* A 型线控器修改外机数据 */
if (ScState == 1) ScState = 0; /* 请求刷新 */
#endif
}
}
}
}
ClrBit(ScFlag,fScRxOk); /* 清除标志 */
ScByteCnt = 0; /* 清除数据 */
}
}
void ScComTx_Sub(void) /* 准备发送数据 */
{
#ifdef MONITOR
u8 i;
#endif
ScBufAdr[0] = (u8)0x0A5; /* 起始码 */
ScBufAdr[2] = NeijiNo; /* 室内风口控制器 */
if (ValBit(SysConfig,fDisHeat)){
SetBit(ScBufAdr[2],6); /* 0: 外机辅助电加热有效 */
}
SetBit(Sysflag,fModeflag); /* 模式发送标志 */
ScBufAdr[4] = (u8)(ValBit(RunMode,fSysOn)? SCom_SM_Tab[RunMode & 0x03] : 0);
//if (!ValBit(Sysflag,fPower)){ /* 不开机时清除 */
// ScBufAdr[4] &= 0x0fc; /* 内机模式 - 不开机,不发送模式 */
//}
if (ValBit(Sysflag,fMAuto)){ /* 自动模式 */
SetBit(ScBufAdr[4],7);
}
ScWordCnt = 6; /* 正常发送共 6 个字节数据 */
#ifdef MONITOR
if ((ScState == 0) || /* 首次上电,申请读外机数据 */
(ScState == 3)){ /* 修改数据后验证读 */
ScBufAdr[2] |= 0x30;
} else if (ScState == 2){ /* 修改数据 */
for (i = 0; i < 18; i++){
ScBufAdr[6 + (i << 1)] = WaiJiShuJu[i];
ScBufAdr[7 + (i << 1)] = (u8)(255 - WaiJiShuJu[i]);
}
ScState = 3; /* 准备验证 */
ScWordCnt = 42; /* 共 42 个数据 */
} /* 正常发送 */
#endif /* MONITOR */
/* 设置反码 */
ScBufAdr[1] = (u8)(255 - ScBufAdr[0]);
ScBufAdr[3] = (u8)(255 - ScBufAdr[2]);
ScBufAdr[5] = (u8)(255 - ScBufAdr[4]);
}
/*** (c) 2005 佛山菱电 **************************** END OF FILE *************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -