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

📄 can.c

📁 该程序完成了c8051外围电路的驱动和串口协议的编写。希望能给大家学习51单片机带来帮助
💻 C
📖 第 1 页 / 共 2 页
字号:
#include "can.h"

unsigned char xdata uchDataRecBuf[8][250];    //收到的数据
unsigned char idata uchDataRecBufIndex=0;            //缓冲区中包数
unsigned char idata uchReadDataRecBufIndex=0;             //读取数据的包指针
unsigned char  uchRePID;
unsigned char uchReDesID;
unsigned char xdata uchReSendDataBuf[300];
unsigned char idata uchFrameRotateIndex = 0;
unsigned char uchInforBagNum = 0xFF;
unsigned char idata uchCanAddress;

//--------------------------------------------------------------------------------------------------
//函数名称:void CANModuleParaInit(void)
//功    能:初始化CAN模块的参数
//输入参数:无
//返    回:无						 
//完成日期:4/13/2007
//-------------------------------------------------------------------------------------------------
void CANModuleParaInit(void)			   //tong add
{
	uchCanAddress = ReadCANAddress();
} 

/////////////////////////////////////////////////////////////////////////////////////////
//void SendPackage(unsigned char pID, unsigned char desID, unsigned char* SendData)
//入口参数:pID:事件类型,desID:目的地址,*SendData:发送数据包	
//函数返回:无
//全局变量:souID:源地址,从插槽上读出的数据
//功能描述:把要解决的问题整理为数据,等候发送
//函数说明:如果发送失败,长度不对
//编写人:  郑福
//编写完成时间: 2007-04-20
//修改人:
//修改完成时间:
//修改原因:                                                
/////////////////////////////////////////////////////////////////////////////////////////
void SendPackage(unsigned char pID, unsigned char desID, unsigned char* SendData)
{
	unsigned char idata uchValue;
	unsigned char idata uchResponFlag;
	unsigned char idata uchSouID;
	unsigned char idata uchMsgLength;
	unsigned char idata uchFrameNum;
	unsigned char idata uchResidByteNum;
	unsigned char idata uchCycIndex,uchSendi,uchSendj;
	unsigned char idata uchFrameFlag;
	unsigned char xdata uchRemotAndData[13];
	unsigned char idata uchDesID = desID;
	unsigned int idata uii;
	unsigned int idata uchSendNum;
    unsigned char idata uchFrameIndex = 0;

    LEDConfigControl();
	
	uchRePID = pID;
    uchReDesID = desID;
	for (uii=0; uii<((SendData[1]<<8 | SendData[2])+3); uii++)
	{
		uchReSendDataBuf[uii] = SendData[uii];
	}

//	read_TRX_error();


	 uchInforBagNum++;
    if(uchInforBagNum >= 8)
    {
		uchInforBagNum = 0;
	}
	if ((SendData[1] == 0x00)&&(SendData[2] == 0x00))
	{
		uchRemotAndData[0]= 0xc0;           //远程帧
		uchRemotAndData[1] = 0x44 | pID; 
		desID = 0xc0 | desID;    // 0xc0 = 0x03<<6;  11只有一帧
		uchRemotAndData[2]= desID;
		uchSouID = uchCanAddress;
		uchResponFlag = SendData[0]<<6;		    
		uchSouID = uchResponFlag | uchSouID;
		uchRemotAndData[3]= uchSouID; 
//		uchRemotAndData[4]= 0x00;
		uchRemotAndData[4] =  (uchInforBagNum<<3) & 0x3C;	 //bagNum and 0frame
		uchRemotAndData[5]= '\0';
		uchRemotAndData[6]= '\0';
		uchRemotAndData[7]= '\0';
		uchRemotAndData[8]= '\0';
		uchRemotAndData[9]= '\0';
		uchRemotAndData[10]= '\0';
		uchRemotAndData[11]= '\0';
		uchRemotAndData[12]= '\0';
		writeCANdata(uchRemotAndData);
	}
	else                                  //CAN数据帧打包开始
	{
		uchSendNum = ((SendData[1]<<8) + SendData[2]);
		uchFrameNum = uchSendNum/8;       //帧数
		uchResidByteNum = uchSendNum%8;   //不够一帧的字节数
	
		for (uchCycIndex=0; uchCycIndex<=uchFrameNum; uchCycIndex++)
		{
			if (uchFrameNum == uchCycIndex)
			{
				if (uchResidByteNum==0x00)
				{
					break;
				}
				else 
				{
					if (uchResidByteNum!=0x00 && uchFrameNum==0)
					{
						uchMsgLength = uchResidByteNum;
						uchFrameFlag = 0x03;//0x03只有一帧  
					}
					else
					{
						uchMsgLength = uchResidByteNum;
						uchFrameFlag = 0x02; // 10  最后一帧
					}
				}
			}
			else 
			{
				uchMsgLength = 0x08;
				if (uchCycIndex == 0x00) 
				{
					if ((uchResidByteNum==0x00)&&(uchFrameNum==0x01))
					{
						uchFrameFlag = 0x03;     //0x03只有一帧
					}
					else 
					{
						uchFrameFlag = 0x00;    // 00 起始帧
					}
				}
				else 
				{
					if ((uchResidByteNum==0x00)&&((uchFrameNum-1)==uchCycIndex))
					{
						uchFrameFlag = 0x02; // 10  最后一帧
					}
					else 
					{
						uchFrameFlag = 0x01;// 01 中间帧
					}
				}
			}

	uchValue = 0x80 + uchMsgLength;// Bit7=1:EFF;Bit6=0:data 
	uchRemotAndData[0] = uchValue;	
	uchRemotAndData[1] =  0x44 | pID;   
	desID = (uchFrameFlag<<6) | uchDesID;
	uchRemotAndData[2] = desID;	

	uchSouID = uchCanAddress;
	uchResponFlag = SendData[0]<<6;		    
	uchSouID = uchResponFlag | uchSouID;
	uchRemotAndData[3] = uchSouID;   
 	uchRemotAndData[4] = (uchFrameIndex<<6 | uchInforBagNum<<3);	
	uchFrameIndex++;

	if(uchFrameIndex == 0x04)
	{
		uchFrameIndex = 0;
	}
	
	if (0x08 == uchMsgLength)
	{
		uchRemotAndData[5] = SendData[uchCycIndex*8+3];
		uchRemotAndData[6] = SendData[uchCycIndex*8+4];
		uchRemotAndData[7] = SendData[uchCycIndex*8+5];
		uchRemotAndData[8] = SendData[uchCycIndex*8+6];
		uchRemotAndData[9] = SendData[uchCycIndex*8+7];
		uchRemotAndData[10] = SendData[uchCycIndex*8+8];
		uchRemotAndData[11] = SendData[uchCycIndex*8+9];
		uchRemotAndData[12] = SendData[uchCycIndex*8+10];
	}
	else 
	{
		uchSendj = 0x00;
		for (uchSendi=0; uchSendi<uchMsgLength; uchSendi++)
		{
			uchRemotAndData[5+uchSendi] = SendData[uchCycIndex*8+3+uchSendi];
			uchSendj++;
		}				
		for (uchSendi=uchSendj; uchSendi<0x08; uchSendi++)
		{
			uchRemotAndData[5+uchSendi] = '\0';
		}
		uchFrameIndex = 0;			
	}
	
	writeCANdata(uchRemotAndData);
		
	if (SendData[0] == 0x01)
	{
		if(uchCycIndex == 0x00) 
 		{
//			CAN_ReSendSetInitia(20);    //启动发送超时定时器4单位是(ms)
		}
		else 
		{
//			CAN_ReSendReVal(20);       //重写超时定时器4
		}
	}	
		} //for(uchCycIndex=0; uchCycIndex<=uchFrameNum; uchCycIndex++)结束
	} //CAN数据帧打包结束

	LEDConfigControl();
}
void SendPackageRemoteFrame(unsigned char pID, unsigned char  desID, unsigned char  *SendData)
{

	unsigned char uchResponFlag;
	unsigned char uchSouID;	
    unsigned char uchCycIndexCopy = 0;
	unsigned char uchPackIndex = 0;
	unsigned char xdata uchRemotAndData[5];
	unsigned char uchDesID = desID;


    uchRePID = pID;
    uchReDesID = desID;
	
 	uchInforBagNum++;
    if(uchInforBagNum >= 8)
    {
		uchInforBagNum = 0;
	}

	uchRemotAndData[0]= 0xc0;           //远程帧
	uchRemotAndData[1] = 0x44 | pID; 
	desID = 0xc0 | desID;    // 0xc0 = 0x03<<6;  11只有一帧
	uchRemotAndData[2]= desID;

⌨️ 快捷键说明

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