📄 canjx.c
字号:
/*
*****************************************************
**函数原型 : void CanDataExplain(void)
**参数说明 :
**返回 值 :
**说 明 :将接收收到的CAN数据进行解析
*****************************************************
*/
void CanDataToExplain(eCANNUM CanNum)
{
uint8 candata[8];
uint8 SourceID; //源地址编号
uint8 CommandID; //命令字
uint8 FrameType; //帧类型
uint8 DataLength; //数据长度
uint8 keybuff[8],i;
uint8 tempstatus;
IO1CLR = LEDCON2;
FrameType = (CRBuf.CANRcvFS.Bits.RTR_BIT&0x01);
DataLength = (CRBuf.CANRcvFS.Bits.DLC_BIT & 0x0f);
SourceID = *((UINT8 *)&CRBuf.RxCANID.Word +1);
CommandID = *((UINT8 *)&CRBuf.RxCANID.Word +0);
candata[0]=*((UINT8 *)&CRBuf.CANRDA.Word+0);
candata[1]=*((UINT8 *)&CRBuf.CANRDA.Word+1);
candata[2]=*((UINT8 *)&CRBuf.CANRDA.Word+2);
candata[3]=*((UINT8 *)&CRBuf.CANRDA.Word+3);
candata[4]=*((UINT8 *)&CRBuf.CANRDB.Word+0);
candata[5]=*((UINT8 *)&CRBuf.CANRDB.Word+1);
candata[6]=*((UINT8 *)&CRBuf.CANRDB.Word+2);
candata[7]=*((UINT8 *)&CRBuf.CANRDB.Word+3);
//send_data(0x00,0x99,candata);
switch(CommandID)
{
case RestState:
RESET_FLAG = 1;// Reset();//软复位
break;
case CAN_REST: //复位站点CAN
RESET_CAN_FLAG = 1;
//SoftRstCAN(0);
//SoftRstCAN(1);
break;
case MOTORRUN:
for(i=0;i<DataLength;i++)
{
motorbuff[i]=candata[i];
Motor_Run(motorbuff[i]);
}
for(i=0;i<DataLength;i++)
{
if((IO1PIN&CLOCKPORT)==0) //沿线闭锁
{
if(candata[i]<7)motorbuff[i] = 0;
}
}
/*for(i=6;i<DataLength;i++)
{
motorbuff[i]=candata[i];
Motor_Run(motorbuff[i]);
}*/
//motorbuff[0]=candata[0];
//Motor_Run(motorbuff[0]);
send_data(LCDBoardID,MOTORRUNING,motorbuff);
break;
case MOTORSTOP:
for(i=0;i<DataLength;i++)
{
stopmotorbuff[i]=candata[i];
Motor_Stop(stopmotorbuff[i]);
}
//stopmotorbuff[0]=candata[0];
//Motor_Stop(stopmotorbuff[0]);
send_data(LCDBoardID,MOTORSTOP,stopmotorbuff);
break;
case 0xba://询问状态 ,采用小端格式放置数据,使之与2119的配置相同
tempstatus=candata[0];
if((tempstatus&0x01)==0x01) MotrState.Bits.BSMOTOR1_BIT=1;
else MotrState.Bits.BSMOTOR1_BIT=0;
if((tempstatus&0x02)==0x02) MotrState.Bits.BSMOTOR2_BIT=1;
else MotrState.Bits.BSMOTOR2_BIT=0;
if((tempstatus&0x04)==0x04) MotrState.Bits.BSMOTOR3_BIT=1;
else MotrState.Bits.BSMOTOR3_BIT=0;
if((tempstatus&0x08)==0x08) MotrState.Bits.BSMOTOR4_BIT=1;
else MotrState.Bits.BSMOTOR4_BIT=0;
if((tempstatus&0x10)==0x10) MotrState.Bits.BSMOTOR5_BIT=1;
else MotrState.Bits.BSMOTOR5_BIT=0;
if((tempstatus&0x20)==0x20) MotrState.Bits.BSMOTOR6_BIT=1;
else MotrState.Bits.BSMOTOR6_BIT=0;
keybuff[0]=MotorStateBack;
keybuff[1]=MotorStateBack>>8;
keybuff[2]=0x88;
keybuff[3]=candata[0]; //add by wm 2007/07/29 回送下发的受控标志是否下发正确
keybuff[4]=VERSION; //程序版本 V12
send_data(LCDBoardID,0xbc,keybuff);//输入板状态
///send_data(LCDBoardID,BoardAck,candata);//送结束句
motorstate=0;
break;
default:
break;
}
}
/*
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -