208 lines
4.1 KiB
C
208 lines
4.1 KiB
C
#include "includes.h"
|
||
|
||
|
||
/*两字节CRC校验
|
||
*len包括校验的长度
|
||
*/
|
||
void NetCRC16_Check(U8_T *aStr ,U16_T len)
|
||
{
|
||
U16_T alen = len-2; //CRC16???????
|
||
U16_T xda , xdapoly ; //校验后的结果,多项式
|
||
U16_T i,j, xdabit ; //缓存变量
|
||
|
||
if(len < 3) //长度小于3
|
||
{
|
||
return ; //直接返回
|
||
}
|
||
xda = 0xFFFF ;
|
||
xdapoly = 0xA001 ; // (X**16 + X**15 + X**2 + 1)
|
||
for(i=0;i<alen;i++)
|
||
{
|
||
xda ^= aStr[i] ;
|
||
for(j=0;j<8;j++)
|
||
{
|
||
xdabit = (U8_T)(xda & 0x01) ;
|
||
xda >>= 1 ;
|
||
if( xdabit ) xda ^= xdapoly ;
|
||
}
|
||
}
|
||
aStr[alen] = (U8_T)(xda & 0xFF) ;
|
||
aStr[alen+1] = (U8_T)(xda>>8) ;
|
||
}
|
||
|
||
|
||
|
||
/** @name CRC16校验得到
|
||
* @para
|
||
* aStr 数组首地址
|
||
* len 数组长度,不包括校验
|
||
*/
|
||
U16_T GetCRC16( U8_T *aStr , U16_T len)
|
||
{
|
||
U16_T xda , xdapoly ;
|
||
U16_T i, j, xdabit ;
|
||
xda = 0xFFFF ;
|
||
xdapoly = 0xA001 ; // (X**16 + X**15 + X**2 + 1)
|
||
for (i = 0; i < len; i++)
|
||
{
|
||
xda ^= aStr[i] ;
|
||
for (j = 0; j < 8; j++)
|
||
{
|
||
xdabit = (unsigned char)(xda & 0x01) ;
|
||
xda >>= 1 ;
|
||
if ( xdabit ) xda ^= xdapoly ;
|
||
}
|
||
}
|
||
|
||
return xda;
|
||
}
|
||
|
||
/*和校验*/
|
||
U8_T SOR_CRC(U8_T *Data, U8_T DataLen)
|
||
{
|
||
U8_T i;
|
||
U8_T sor_data = 0;
|
||
|
||
for(i = 0; i < DataLen; i++)//i可能为0 ,也可以是1
|
||
{
|
||
sor_data = sor_data+Data[i];
|
||
}
|
||
return sor_data;
|
||
}
|
||
|
||
|
||
|
||
/*控制回复报文*/
|
||
void Rs485AskCtrlSend(U8_T* Recdata)
|
||
{
|
||
U8_T SendData[10];
|
||
|
||
SendData[0] = 0x55;
|
||
SendData[1] = 0x55;
|
||
SendData[2] = 0xee; //头
|
||
|
||
SendData[3] = 0x07; //长度
|
||
SendData[4] = Tem_Type; //类型
|
||
|
||
SendData[6] = 0x01; //类型 - 红外转发
|
||
SendData[5] = g_Dip.DIP_addr;
|
||
SendData[7] = 0x01; //内容 - 接收成功
|
||
|
||
NetCRC16_Check(&SendData[0+3], SendData[0+3]); //校验
|
||
|
||
Set_GroupSend(SendData,10,1,BUSSend_ValidTime3,20); //组包
|
||
|
||
}
|
||
|
||
|
||
|
||
/**************************************************************************
|
||
* IrSend_Rs485_Pro
|
||
* 描述 :红外转发接收处理函数
|
||
* 输入 :
|
||
* RecData 接收数据
|
||
* Len 数据长度
|
||
* 输出 :无
|
||
* 调用 :无
|
||
*************************************************************************/
|
||
U8_T IrSend_Rs485_Pro(U8_T *RecData, U16_T Len)
|
||
{
|
||
U8_T ret = 0;
|
||
U16_T Crc_buf; //正确报文校验保存
|
||
|
||
if(0x0D != Len)
|
||
{
|
||
return 0x01;
|
||
}
|
||
|
||
if((0x55 != RecData[0]) || (0x55 != RecData[1])|| (0xee != RecData[2]) )
|
||
{
|
||
return 0x02;
|
||
}
|
||
|
||
if( (g_Dip.DIP_addr != RecData[6])&&(0xFF != RecData[6]) )
|
||
{
|
||
return 0x03;
|
||
}
|
||
|
||
if( (RecData[3] + 3 != Len) || (Tem_Type != RecData[4]))
|
||
{
|
||
return 0x04;
|
||
}
|
||
|
||
Crc_buf = GetCRC16(&RecData[3], RecData[3]-2);
|
||
if(Crc_buf == (RecData[Len-2]+(RecData[Len-1]<<8))) //校验通过
|
||
{
|
||
//控制空调
|
||
if(0x01 == RecData[5])
|
||
{
|
||
//设置温度命令
|
||
if((TEM_MIN_SET <= RecData[7]) && (RecData[7] < TEM_MAX_SET)) //在指定温度范围内
|
||
{
|
||
TempCtrl.TemState_Now.set_t = (RecData[7]&0x1f);
|
||
}else if(RecData[7] == TEM_MAX_SET){
|
||
TempCtrl.TemState_Now.set_t = (RecData[7]&0x20);
|
||
}
|
||
|
||
switch(RecData[8])
|
||
{
|
||
case 0x00:
|
||
TempCtrl.TemState_Now.on_off = TEMP_OFF; //关机
|
||
break;
|
||
case 0x01:
|
||
TempCtrl.TemState_Now.on_off = TEMP_ON; //开机
|
||
break;
|
||
default:
|
||
break; //报文有误
|
||
}
|
||
|
||
switch(RecData[9]) //风速
|
||
{
|
||
case 0x03:
|
||
TempCtrl.TemState_Now.fan = FAN_HIGH; //高风速
|
||
break;
|
||
case 0x02:
|
||
TempCtrl.TemState_Now.fan = FAN_MID; //中风速
|
||
break;
|
||
case 0x01:
|
||
TempCtrl.TemState_Now.fan = FAN_LOW; //低风速
|
||
break;
|
||
case 0x00:
|
||
TempCtrl.TemState_Now.fan = FAN_STOP; //低风速
|
||
break;
|
||
default:
|
||
break;
|
||
}
|
||
|
||
switch(RecData[10]) //
|
||
{
|
||
case 0x00:
|
||
TempCtrl.TemState_Now.mode = MODEL_COLD; //制冷
|
||
break;
|
||
case 0x01:
|
||
TempCtrl.TemState_Now.mode = MODEL_HOT; //制热
|
||
break;
|
||
case 0x02:
|
||
TempCtrl.TemState_Now.mode = MODEL_WIND; //送风
|
||
break;
|
||
default:
|
||
break;
|
||
}
|
||
|
||
Rs485AskCtrlSend(RecData);
|
||
return 0x00;
|
||
}
|
||
|
||
}
|
||
|
||
return 0x01;
|
||
}
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|