#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>= 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; }