⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 canjx.c

📁 解析接收到的CAN数据
💻 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 + -