//解析用户协议
static unsigned int Crack_User_data(USART_TypeDef * pUSARTx,unsigned char BUF[],unsigned char Find_point)
{
//长度与长度位置
volatile unsigned char Frame_LONG=0;
volatile unsigned char Frame_LONG_point=0XFF;
//功能与功能位置
volatile unsigned char Frame_FUN=0;
volatile unsigned char Frame_FUN_point=0XFF;
//校验与校验位置
volatile unsigned char CRC_TMP=0;
volatile unsigned char CRC_TMP_point=0XFF;
volatile unsigned char CRC_CNT=0;
volatile unsigned char CRC_DAT=0;
//全局功能状态
volatile unsigned int STEP_SYS_TMP=0;
//长度与长度位置
Frame_LONG_point=Find_point+4;
Frame_LONG=BUF[Frame_LONG_point];
// printf("Frame_LONG_point @%d;Frame_LONG@%d;\r\n",Frame_LONG_point,Frame_LONG);
//功能与功能位置
Frame_FUN_point=Find_point+5;
Frame_FUN=BUF[Frame_FUN_point];
// printf("Frame_FUN_point @%d;Frame_FUN@%d;\r\n",Frame_FUN_point,Frame_FUN);
//校验与校验位置
CRC_TMP_point=Frame_LONG-1-1;
CRC_TMP=BUF[CRC_TMP_point];
// printf("CRC_TMP_point @%d;CRC_TMP@%d;\r\n",CRC_TMP_point,CRC_TMP);
//将有效数据位赋值到缓冲数组中
for(unsigned char RCV_CNT=0; RCV_CNT<Frame_LONG; RCV_CNT++)
{
if(pUSARTx==UART1_USARTx)
{
UART1_Flag.RCV_BUF[RCV_CNT]=BUF[RCV_CNT];
printf("RCV_BUF[%d]=@%d;%d\r\n",RCV_CNT,UART1_Flag.RCV_BUF[RCV_CNT],BUF[RCV_CNT]);
}
if(pUSARTx==UART2_USARTx)
{
UART2_Flag.RCV_BUF[RCV_CNT]=BUF[RCV_CNT];
printf("RCV_BUF[%d]=@%d;%d\r\n",RCV_CNT,UART2_Flag.RCV_BUF[RCV_CNT],BUF[RCV_CNT]);
}
if(pUSARTx==UART3_USARTx)
{
UART3_Flag.RCV_BUF[RCV_CNT]=BUF[RCV_CNT];
printf("RCV_BUF[%d]=@%d;%d\r\n",RCV_CNT,UART3_Flag.RCV_BUF[RCV_CNT],BUF[RCV_CNT]);
}
if(pUSARTx==UART4_USARTx)
{
UART4_Flag.RCV_BUF[RCV_CNT]=BUF[RCV_CNT];
printf("RCV_BUF[%d]=@%d;%d\r\n",RCV_CNT,UART4_Flag.RCV_BUF[RCV_CNT],BUF[RCV_CNT]);
}
if(pUSARTx==UART5_USARTx)
{
UART5_Flag.RCV_BUF[RCV_CNT]=BUF[RCV_CNT];
printf("RCV_BUF[%d]=@%d;%d\r\n",RCV_CNT,UART5_Flag.RCV_BUF[RCV_CNT],BUF[RCV_CNT]);
}
}
for(CRC_CNT=0; CRC_CNT<Frame_LONG-2; CRC_CNT++)
{
CRC_DAT+=User_BUF[CRC_CNT];
}
// printf("CRC_DAT @%d-%d;\r\n",CRC_TMP,CRC_DAT);
//功能码的解析,并且校验校验字,注意校验位的位数是第几位
switch(Frame_FUN)
{
case 1://001,查询
if(CRC_DAT==CRC_TMP)
{
STEP_SYS_TMP=1;
}
else
{
STEP_SYS_TMP=Sys_CRC_ERROR;
}
break;
case 2://002,开关
if(CRC_DAT==CRC_TMP)
{
Power_switch_DAT=User_BUF[Find_point+5+1];
BD_AP1_DAT=User_BUF[Find_point+5+2];
ZZW_AP1_DAT=User_BUF[Find_point+5+3];
ZZW_AP2_DAT=User_BUF[Find_point+5+4];
//
STEP_SYS_TMP=2;
}
else
{
STEP_SYS_TMP=Sys_CRC_ERROR;
}
break;
case 3://指令3
if(CRC_DAT==CRC_TMP)
{
STEP_SYS_TMP=3;
}
else
{
STEP_SYS_TMP=Sys_CRC_ERROR;
}
break;
case 4://指令4
if(CRC_DAT==CRC_TMP)
{
STEP_SYS_TMP=4;
}
else
{
STEP_SYS_TMP=Sys_CRC_ERROR;
}
break;
case 5://指令5
if(CRC_DAT==CRC_TMP)
{
STEP_SYS_TMP=5;
}
else
{
STEP_SYS_TMP=Sys_CRC_ERROR;
}
break;
case 6://指令6
if(CRC_DAT==CRC_TMP)
{
STEP_SYS_TMP=6;
}
else
{
STEP_SYS_TMP=Sys_CRC_ERROR;
}
break;
case 7://指令7
if(CRC_DAT==CRC_TMP)
{
STEP_SYS_TMP=7;
}
else
{
STEP_SYS_TMP=Sys_CRC_ERROR;
}
break;
case 8://指令8
if(CRC_DAT==CRC_TMP)
{
STEP_SYS_TMP=8;
}
else
{
STEP_SYS_TMP=Sys_CRC_ERROR;
}
break;
case 9://指令9
if(CRC_DAT==CRC_TMP)
{
STEP_SYS_TMP=9;
}
else
{
STEP_SYS_TMP=Sys_CRC_ERROR;
}
break;
default:
STEP_SYS_TMP=Sys_CRC_ERROR;
break;
}
//返回数据
return STEP_SYS_TMP;
} |