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

📄 gateway.c

📁 LPC2129芯片串口和can口使用利用该芯片那带串口和can控制器设计转换桥
💻 C
字号:
/****************************************Copyright (c)**************************************************
********************************************************************************************************/
#define		_GATEWAY_GLOBAL_

#include "..\..\src\config.h"	
#include "main.h"	

//测试代码
//12 00 88 12 34 56 78 00 11 22 33 44 55 66 77 02 00

INT8U	ModeStatus;
INT32U RcvCounter=0;
INT8U	SendCommand;

const	char	strHelloArmCan [ ]	= {0x00,0x00,0x00,0xAA,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};//"LPC2129 CAN";
const	char	strDATErr [ ]		= {0x00,0x00,0x00,0xA0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};//"Send Timeout";
const	char	strDATErrr[ ]		= {0x00,0x00,0x00,0xAC,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};//"Send Timeout";
const	char	strCanErr [ ]   	= {0x00,0x00,0x00,0xAE,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};//"RECV Timeout";
const	char	strCheckSunErr[]    = {0x00,0x00,0x00,0xAF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};//"RECV Timeout";
/*
************************************************************************************************************************
**函数原型	:  void	UartComPol(void)
**参数说明	:  	
**返回	值	:  	
**说	明	: 该函数用于解析RS232数据到CAN数据的协议	
************************************************************************************************************************
*/

INT32U	UartComPol (INT8U  *UARTBuf)
{
	INT32U	i = 0;
	INT32U	status =  0;
	INT8U	CheckSum = 0;
	INT8U	*Point ;
	Point = UARTBuf;
//	SendCommand=1;
	
	if (*(Point + 1) < CAN_MAX_NUM)
	{
		//简单的校验,采用累加和方式
		for (i = 0; i<16; i++)
		{
			CheckSum  = *(Point + i) + CheckSum;
		}
		
		UARTBuf[16] = CheckSum;
		
		if (CheckSum == *(Point + 16))
		{
			CANChunel = *(Point + 1);
			CanSendFlag = 1;
		}
		else
		{
			//校验错误处理
			memcpy(UARTSendBuf, strCheckSunErr, strlen (strCheckSunErr));
			UARTSend (UART0,strlen (strCheckSunErr),UARTSendBuf);
			CanSendFlag = 0;
			status = 1;
			goto exit;
		}
			
	}
	else	//CAN通道号错误处理
	{
		memcpy(UARTSendBuf, strCanErr, 12);
		UARTSend (UART0,12,UARTSendBuf);
		status = 1;
		CanSendFlag = 0;
		//BEEP_ON;
	}
	
	/*	*/
exit:
	return status;
}

/*
************************************************************************************************************************
**函数原型	:  	void	CanHexToRs232ASCII(UINT8 *Buf,UINT8 iBYTE)
**参数说明	:  	
**返回	值	:	
**说	明	:	将HEX格式的CAN数据转换为RS232ASCII码格式
************************************************************************************************************************
*/
void	CanHexToRs232ASCII(INT8U *Buf,INT8U iBYTE)
{
	INT8U	i= iBYTE >> 4;
	if(i<0x0A)
	{
		*Buf = 0x30 +i;		//数字0--9
	}
	else
	{
		*Buf = 0x37 +i;		//字母A--Z(大写)
	}
	i = iBYTE &0x0F;
	if(i<0x0A)
	{
		*(Buf+1) = 0x30 +i;
	}
	else
	{
		*(Buf+1) = 0x37 +i;
	}
}


/*
************************************************************************************************************************
**函数原型	:  	UINT32	Rs232toCANDataConver (void)
**参数说明	:  	
**返回	值	:	0;成功发送;1;发送失败
**说	明	:	将接收到的232数据发送到CAN
************************************************************************************************************************
*/
INT32U	Rs232toCANDataConver (stcRxBUF *CANBuf, INT8U *UARTBuf)
{
	INT32U	statue,i;
	statue = 0;
	statue = UartComPol( UARTBuf);
	if (statue == 0)
	{
		CANBuf->CANRcvFS.Bits.FF= ((*(UARTBuf + 2)&0x80)>>7);
		CANBuf->CANRcvFS.Bits.RTR=((*(UARTBuf + 2)&0x40)>>6);
		CANBuf->CANRcvFS.Bits.DLC=(*(UARTBuf + 2)&0x0f);
		for(i=0;i<4;i++)										
		{
			*((INT8U *)(&CANBuf->RxCANID)+ 3- i) = *(UARTBuf + 3 + i);
			*((INT8U *)(&CANBuf->RDA) + i ) = *(UARTBuf + 7 + i);
			*((INT8U *)(&CANBuf->RDB) + i ) = *(UARTBuf + 11 + i);
		}
	}
	return statue;
}
	

/*
************************************************************************************************************************
**函数原型	:  	void	CanDataToRs232(void)
**参数说明	:  	
**返回	值	:	
**说	明	:	将接收收到的CAN数据发送到RS232
************************************************************************************************************************
*/
INT32U CANtoRs232DataConver(eCANNUM CanNum, stcRcvCANCyBuf  *RcvCyBuf )
{
	INT8U	i,point;
	INT8U	TempBuf[15];
	INT8U	TransCounter = 0;
//	len =	strlen(strCANChunl);len,
	point = RcvCyBuf->ReadPoint;
	/****************************************
	**			显示CAN通道号
	****************************************/
	//memcpy(UARTSendBuf, strCANChunl, len);					//显示CAN通道标题“CAN:”
	//TransCounter += len;								
	//CanHexToRs232ASCII(&UARTSendBuf[TransCounter], CanNum);	//实际CAN通道号转换为ASII码
	
	/*
	UARTSendBuf[TransCounter]=CanNum;
	TransCounter += 1;
	*/
	//UARTSendBuf[TransCounter++]=0x0D;							//回车
	//UARTSendBuf[TransCounter++]=0x0A;							//换行
	/******************************************
	**			从CAN的环形缓冲区读取信息			
	*******************************************/
	//读取帧信息FIF
	TempBuf[0]	=	(INT8U)RcvCyBuf->RcvBuf[point].CANRcvFS.Bits.DLC| 		
			  		((INT8U)RcvCyBuf->RcvBuf[point].CANRcvFS.Bits.FF<< 7)| 
			   		((INT8U)RcvCyBuf->RcvBuf[point].CANRcvFS.Bits.RTR<< 6);
	
	for(i=0;i<4;i++)										
	{	//读取帧标识符FID
		TempBuf[1+i]=*((INT8U *)(&RcvCyBuf->RcvBuf [point].RxCANID) + 3 - i);
		//读取帧数据Dat
		TempBuf[5+i]=*((INT8U *)(&RcvCyBuf->RcvBuf [point].RDA) + i );
		TempBuf[9+i]=*((INT8U *)(&RcvCyBuf->RcvBuf [point].RDB) + i );
	}
	
	
	/******************************************
	***		显示帧信息
	*******************************************/
	//memcpy(&UARTSendBuf[TransCounter],strCANFif,len);			//帧信息标题“FID:”
	//TransCounter += len;
	/*
	if((TempBuf[0]&0x0f)>8)
	{
		TempBuf[0] = (TempBuf[0]&0xf0) + 8;
	}
	//CanHexToRs232ASCII(&UARTSendBuf[TransCounter],TempBuf[0]);//帧信息转换为ASCII码
	UARTSendBuf[TransCounter]=TempBuf[0];
	TransCounter += 1;
	//UARTSendBuf[TransCounter++]=0x0D;							//回车
	//UARTSendBuf[TransCounter++]=0x0A;							//换行
	
	*/
	/****************************************
	**		显示帧标识符
	*****************************************/
	//memcpy(&UARTSendBuf[TransCounter],strCANFid, len);		//帧标识符标题“FID:”
	//TransCounter+= len;
	for(i=1;i<5;i++)
	{													//帧标识符转化为ASCII码
		//CanHexToRs232ASCII(&UARTSendBuf[TransCounter],TempBuf[i]);
		UARTSendBuf[TransCounter]=TempBuf[i];
		TransCounter += 1;
	}
	//UARTSendBuf[TransCounter++]=0x0D;							//回车
	//UARTSendBuf[TransCounter++]=0x0A;							//换行
	/****************************************
	**		显示帧数据
	*****************************************/
	//memcpy(&UARTSendBuf[TransCounter],strCANData,len);//帧数据标题“Dat:”
	//TransCounter += len;
	for(i=5; i<(TempBuf[0]&0x0f)+5; i++)		//数据转换成ASCII码
	{
		//CanHexToRs232ASCII(&UARTSendBuf[TransCounter],TempBuf [i]);
		UARTSendBuf[TransCounter]=TempBuf[i];
		TransCounter += 1;
	}
	//UARTSendBuf[TransCounter++]=0x0D;
	//UARTSendBuf[TransCounter++]=0x0A;
	//UARTSendBuf[TransCounter++]=0x0D;
	//UARTSendBuf[TransCounter++]=0x0A;					//发送完一帧相隔一行
	return TransCounter;	
}
/*
************************************************************************************************************************
**函数原型	:  	CANSendToRS232
**参数说明	:  	
**返回	值	:	
**说	明	:	将接收收到的CAN数据发送到RS232
************************************************************************************************************************
*/
void	CANSendToRS232 (eCANNUM CanNum, eUARTNUM UARTNum, stcRcvCANCyBuf  *RcvCyBuf )
 {
 	INT32U	Len;
	if (LEDSTATUS1)
	{
		A_LED1_ON;
		LEDSTATUS1=0;
	}
	else
	{
		A_LED1_OFF;
		LEDSTATUS1=1;
	}
	
	Len = CANtoRs232DataConver(CanNum, RcvCyBuf );
	if(++RcvCyBuf->ReadPoint >= USE_CAN_cycRCV_BUF_SIZE)
	{
		RcvCyBuf->ReadPoint =0;
	}
	RcvCyBuf->FullFlag=0;
	//调用串口发送函数
	//if((CanNum==0)&&(SendCommand==1))
	//{
	//	SendCommand=0;
	//}
	//else
	{
		UARTSend(UARTNum,Len, UARTSendBuf);				//调用UART发送程序
	}
 }
 /*
************************************************************************************************************************
**函数原型	:  	CANSendToRS232
**参数说明	:  	
**返回	值	:	
**说	明	:	将接收收到的CAN数据发送到RS232
************************************************************************************************************************
*/
 void	RS232SendToCAN (eCANNUM CanNum, INT32U Cmd,stcRxBUF  *CANBuf, INT8U *UARTBuf )
{	
	if (LEDSTATUS2)
	{
		A_LED2_ON;
		LEDSTATUS2=0;
	}
	else
	{
		A_LED2_OFF;
		LEDSTATUS2=1;
	}
	if (!Rs232toCANDataConver (CANBuf, UARTBuf))
	{
		CANSendData(CanNum,Cmd,CANBuf);
	}

}
/*********************************************************************************************************
**                            			End Of File
********************************************************************************************************/

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -