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

📄 can.c

📁 该程序完成了c8051外围电路的驱动和串口协议的编写。希望能给大家学习51单片机带来帮助
💻 C
📖 第 1 页 / 共 2 页
字号:
	uchSouID = uchCanAddress;
	uchResponFlag = SendData[0]<<6;		    
	uchSouID = uchResponFlag | uchSouID;
	uchRemotAndData[3]= uchSouID; 
	uchRemotAndData[4] =  (uchInforBagNum<<3) & 0x3C;	 //bagNum and 0frame
	uchRemotAndData[5]= '\0';
	uchRemotAndData[6]= '\0';

	
	writeCANdataRemateFrame(uchRemotAndData);	
}




/////////////////////////////////////////////////////////////////////////////////////////
//void CanFrameInterrupt();
//入口参数:无	
//函数返回:无
//全局变量:uchDataRecBuf[][9]:收到的数据,send_address:发送芯片的地址
//功能描述:整理接收区内的数据
//函数说明
//编写人:  郑福
//编写完成时间: 2007-04-20
//修改人:
//修改完成时间:
//修改原因:                                                
/////////////////////////////////////////////////////////////////////////////////////////
void CanFrameInterrupt(unsigned char *uchReceiData)
{
	unsigned char uchFrameType;
	unsigned char uchFrameFlag;
	unsigned char uchFrameNum;
	unsigned char uchResidByteNum;
	unsigned char uchRemoFrameAdd;   //远程帧发送方地址
	unsigned char uchBagResponFlag;  //00:不需要回应 01:需要回应
	unsigned char uchRemoFramedata[3];
	unsigned char *puchReceiData;     //接收数据的指针
    unsigned  char  uchReceiFrameSerial = 0;
	unsigned char  uchtemp = 0;

    puchReceiData=uchReceiData;
    
	uchRemoFramedata[0] = 0x10;            //响应帧
	uchRemoFramedata[1] = 0x00;            //远程帧无数据
	uchRemoFramedata[2] = '\0';
	uchReceiFrameSerial = (puchReceiData[4]>>6) & 0x03;
    uchFrameNum = uchReceiFrameSerial;
	uchFrameType = puchReceiData[0] & 0xc0;
	if (uchFrameType == 0xc0)
	{
		uchRemoFrameAdd = puchReceiData[3] & 0x3f;//发送芯片的地址
//		Close_CANReSend();//关闭发送超时定时器4			
	}
	else//开始else
	{		
		uchFrameFlag = puchReceiData[2] & 0xc0;   //11 00  00000
		if (uchFrameFlag == 0x00)           //0000 0000
		{				
			uchDataRecBuf[uchDataRecBufIndex][0] = puchReceiData[3] & 0x3f;//发送芯片的地址
			uchDataRecBuf[uchDataRecBufIndex][3] = puchReceiData[5];
			uchDataRecBuf[uchDataRecBufIndex][4] = puchReceiData[6];
			uchDataRecBuf[uchDataRecBufIndex][5] = puchReceiData[7];
			uchDataRecBuf[uchDataRecBufIndex][6] = puchReceiData[8];
			uchDataRecBuf[uchDataRecBufIndex][7] = puchReceiData[9];
			uchDataRecBuf[uchDataRecBufIndex][8] = puchReceiData[10];
			uchDataRecBuf[uchDataRecBufIndex][9] = puchReceiData[11];
			uchDataRecBuf[uchDataRecBufIndex][10] = puchReceiData[12];
            uchFrameRotateIndex = 0;
		}
		else 
			if( uchFrameFlag == 0x40 ) //0100 0000
			{	
				uchtemp = uchFrameRotateIndex*4*8;				
				uchDataRecBuf[uchDataRecBufIndex][uchtemp+uchFrameNum*0x08+3] = puchReceiData[5];
				uchDataRecBuf[uchDataRecBufIndex][uchtemp+uchFrameNum*0x08+4] = puchReceiData[6];
				uchDataRecBuf[uchDataRecBufIndex][uchtemp+uchFrameNum*0x08+5] = puchReceiData[7];
				uchDataRecBuf[uchDataRecBufIndex][uchtemp+uchFrameNum*0x08+6] = puchReceiData[8];
				uchDataRecBuf[uchDataRecBufIndex][uchtemp+uchFrameNum*0x08+7] = puchReceiData[9];
				uchDataRecBuf[uchDataRecBufIndex][uchtemp+uchFrameNum*0x08+8] = puchReceiData[10];
				uchDataRecBuf[uchDataRecBufIndex][uchtemp+uchFrameNum*0x08+9] = puchReceiData[11];
				uchDataRecBuf[uchDataRecBufIndex][uchtemp+uchFrameNum*0x08+10] = puchReceiData[12];

                if (uchFrameNum==0x03)
                {
                    uchFrameRotateIndex++;
                }
			}
			else 
				if (uchFrameFlag == 0x80)
				{								
					puchReceiData[0] = puchReceiData[0] & 0x0f;//数据长度
                    uchDataRecBuf[uchDataRecBufIndex][1] = (uchFrameRotateIndex*4*8+uchFrameNum*8+puchReceiData[0])/256;
					uchDataRecBuf[uchDataRecBufIndex][2] = (uchFrameRotateIndex*4*8+uchFrameNum*8+puchReceiData[0])%256;
					for (uchResidByteNum=0; uchResidByteNum<puchReceiData[0]; uchResidByteNum++)
					{			
						uchDataRecBuf[uchDataRecBufIndex][uchFrameRotateIndex*4*8+uchFrameNum*0x08+3+uchResidByteNum] = puchReceiData[5+uchResidByteNum];
					}
					uchDataRecBuf[uchDataRecBufIndex][uchFrameRotateIndex*4*8+uchFrameNum*0x08+3+uchResidByteNum+1] = '\0';	
                    uchFrameRotateIndex = 0;
					uchDataRecBufIndex++;//增加一包记录
					if (uchDataRecBufIndex>=8) 
					{
						uchDataRecBufIndex = 0;//到了包的边界
					}
					if (uchDataRecBufIndex==uchReadDataRecBufIndex)
					{
				    	uchReadDataRecBufIndex++;  //说明前面的包没有读走,后面的包将要覆盖前面的数据
					}
					uchRemoFrameAdd = puchReceiData[3] & 0x3f;
					uchBagResponFlag = puchReceiData[3] & 0x40;
                    if ((puchReceiData[2]<<2)!=0xfc)
                    {
						if (uchBagResponFlag == 0x40)
		  			    {
							SendPackageRemoteFrame(0x47, uchRemoFrameAdd, uchRemoFramedata);  //发送响应帧 
						}
                    }
				}
				else 
					if (uchFrameFlag == 0xc0)
					{
						puchReceiData[0] = puchReceiData[0] & 0x0f;
						uchDataRecBuf[uchDataRecBufIndex][0] = puchReceiData[3] & 0x3f;//发送芯片的地址
						uchDataRecBuf[uchDataRecBufIndex][1] = 0;
				    	uchDataRecBuf[uchDataRecBufIndex][2] = puchReceiData[0];
						for (uchResidByteNum=0; uchResidByteNum<puchReceiData[0]; uchResidByteNum++)
						{	
							uchDataRecBuf[uchDataRecBufIndex][3+uchResidByteNum] = puchReceiData[5+uchResidByteNum];
						}
						uchDataRecBuf[uchDataRecBufIndex][3+uchResidByteNum+1] = '\0';	
						uchDataRecBufIndex++;//增加一包记录
						if (uchDataRecBufIndex>=8) 
						{
							uchDataRecBufIndex=0;     //到了包的边界
						}
						if (uchDataRecBufIndex==uchReadDataRecBufIndex)
 					    {
							uchReadDataRecBufIndex++; //说明前面的包没有读走,后面的包将要覆盖前面的数据
						}
						uchRemoFrameAdd = puchReceiData[3] & 0x3f;
						uchBagResponFlag = puchReceiData[3] & 0x40;
                        if ((puchReceiData[2]<<2)!=0xfc)
                        {
							if (uchBagResponFlag == 0x40)
	  					    {
								SendPackageRemoteFrame(0x47, uchRemoFrameAdd, uchRemoFramedata);  //发送响应帧 
							}
                        }
					}

	}// 结束ELSE	
}
/////////////////////////////////////////////////////////////////////////////////////////
//unsigned char BagNum(void)
//入口参数:	
//函数返回:包数
//全局变量:uchDataRecBuf[][9]:收到的数据,send_address:发送芯片的地址
//功能描述:读出接收区内的数据
//函数说明:
//编写人:  郑福
//编写完成时间: 2007-04-20
//修改人:
//修改完成时间:
//修改原因:                                                
/////////////////////////////////////////////////////////////////////////////////////////
unsigned char BagNum(void)
{ 	
	unsigned char idata uchInforBagNum;
	if (uchDataRecBufIndex>=uchReadDataRecBufIndex)
    {
		uchInforBagNum = uchDataRecBufIndex-uchReadDataRecBufIndex;//接收缓存区数据
	}
	else 
	{
		uchInforBagNum = 8+uchDataRecBufIndex-uchReadDataRecBufIndex;
	}
	return uchInforBagNum;   
}

/////////////////////////////////////////////////////////////////////////////////////////
//unsigned char* GetAMessage(void)
//入口参数:	
//函数返回:优先级(即事件类型)0:报警事件,1:系统事件,2:信号,3:初始化数据,4:数据读写
//全局变量:uchDataRecBuf[][9]:收到的数据,send_address:发送芯片的地址
//功能描述:读出接收区内的数据
//函数说明:一定要在指针减一前,关闭CAN中断,指针减一后,打开CAN中断
//编写人:  郑福
//编写完成时间: 2007-04-20
//修改人:
//修改完成时间:
//修改原因:                                                
/////////////////////////////////////////////////////////////////////////////////////////
unsigned char *GetAMessage(void)
{ 
	unsigned char *puchGetRec; 
	if (uchReadDataRecBufIndex==uchDataRecBufIndex) 
	{
		puchGetRec = '\0';   //没有数据包
	}
	else 
	{
		puchGetRec = uchDataRecBuf[uchReadDataRecBufIndex];
		if (uchReadDataRecBufIndex<7)
		{
	    	uchReadDataRecBufIndex++;
		}
		else 
		{
			uchReadDataRecBufIndex = 0;
		}
	}	
	return puchGetRec; //收到的数据指针
}

/////////////////////////////////////////////////////////////////////////////////////////////////
//void ClearAllMessage();
//入口参数:      无
//函数返回:      无
//功能描述:      清除CAN接收的整包数据
//编写人:        郑福
//编写完成时间:  2007-04-20
//修改人:
//修改完成时间:
//修改原因:
/////////////////////////////////////////////////////////////////////////////////////////////////
void ClearAllMessage()
{
	uchDataRecBufIndex = uchReadDataRecBufIndex;//清除接收缓存区数据
}


⌨️ 快捷键说明

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