Files
RS485_T1_Transition/Source/SYSTEM/uart_protocol.c

208 lines
4.1 KiB
C
Raw Normal View History

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