Files
RS485_T1_Transition/Source/SYSTEM/uart_protocol.c
yeyangwen 5a726f7378 feat:修改设备类型
feat:修改为红外转发设备,将中弘网关协议转换为主机红外协议
2026-02-09 17:48:39 +08:00

208 lines
4.1 KiB
C
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#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;
}