feat:修改设备类型
feat:修改为红外转发设备,将中弘网关协议转换为主机红外协议
This commit is contained in:
207
Source/SYSTEM/uart_protocol.c
Normal file
207
Source/SYSTEM/uart_protocol.c
Normal file
@@ -0,0 +1,207 @@
|
||||
#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;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user