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

📄 main.c

📁 CAN转232及485的通讯卡程序,调试通过
💻 C
📖 第 1 页 / 共 2 页
字号:
*	
*********************************************************************************************************
*/
void SerialInterrupt(void) interrupt 4 using 2
{
	DisableInterrupt();
	if (TI) 
	{	
		TI = 0;
	  int_232=1;  //232成功发送一字节,置232发送完成标志
	}
//////////////////////////////////////////////////////////////////////////////////////////////////////////
	if (RI) 
	{
		RI = 0;	
		rx_232=1; //232成功接收一字节,置232接收完成标志
	 }	
	EnalbeInterrupt();
}

      
/*********************************************************************************************************
* 
* 函数名称:Seria2Interrupt
*	
* 输入变量:无
* 
* 输出变量:无
* 
* 功能描述:串口中断1函数(中断号为 8,使用寄存器 1)
*	
*********************************************************************************************************
*/
void Seria2Interrupt(void) interrupt 15 using 2
{
	
	DisableInterrupt();
	if (TI_1) 
	{	
		TI_1 = 0;
		int_485=1;//485成功发送一字节,置232发送完成标志
		
	}
//////////////////////////////////////////////////////////////////////////////////////////////////////////
	if (RI_1) 
	{
		RI_1 = 0;	
		rx_485=1;//485成功接收一字节,置232接收完成标志
	}
	EnalbeInterrupt();
}


/*
*********************************************************************************************************
* 
* 函数名称:Sendto485
*	
* 输入变量:要发送的数据
* 
* 输出变量:无
* 
* 功能描述:把接收到的数据发送到485
*	
*********************************************************************************************************
*/

void Sendto485(unsigned char  *data485)
{

		send_485 = data485;//存将要发送数据的首地址
		length_485 = 12;   //设置发送数据长度
		SBUF1 = *send_485; //发送数据到485
	
}

/*
*********************************************************************************************************
* 
* 函数名称:Sendto232
*	
* 输入变量:要发送的数据
* 
* 输出变量:无
* 
* 功能描述:把接收到的数据发送到232
*	
*********************************************************************************************************
*/

void Sendto232(unsigned char  *data232)
{
		send_232=data232;//存将要发送数据的首地址
		length_232=12;//设置发送数据长度
		SBUF=*send_232;//发送数据到232
		
}

/*
*********************************************************************************************************
* 
* 函数名称:Changetoadr
*	
* 输入变量:无
* 
* 输出变量:无
* 
* 功能描述:把CAN接收到的ID转换成232,485的地址
*	
*********************************************************************************************************
*/

void Changetoadr(void)
{
	unsigned char i,temp[4];
	for(i=0;i<4;i++)
	temp[i]=TCandata[i+1];
	TCandata[1] = temp[0]>>3;
	TCandata[2] = (temp[0]<<5 | temp[1]>>3);
	TCandata[3] = (temp[1]<<5 | temp[2]>>3);
	TCandata[4] = (temp[2]<<5 | temp[3]>>3);
} 

/*
*********************************************************************************************************
* 
* 函数名称:main
*	
* 输入变量:无
* 
* 输出变量:无
* 
* 功能描述:主循环函数,通常是一个无限循环
*	
*********************************************************************************************************
*/
void main(void)
{  
	unsigned char i;
	DisableInterrupt();
  AUXR = 0x00;
	CpuInit();
	SjaInit();	
	EnalbeInterrupt();

	AUXR = 0x01;
	ucCircle = 0;
	bSjaReceived = FALSE;
	int_flag_232 = 1;
	int_flag_485 = 1;
	int_232=0;
	int_485=0;
	rx_232=0;
	rx_232=0;
	rx_flag_232 = 0;
	rx_flag_485 = 0;
	length_485 = 0;
	length_232 = 0;
  Control485=0;
  LED=0;
	while (1)  
	{		
		LED^=1; //喂狗
/////////////////////////////从232接收,发送到can,485///////////////////////////////////
		if (rx_flag_232 == 1 || RCount_232 > TCount_232)   //232接收完成或还存在没发送出去的数据
		{	 
        if(int_flag_485) //一帧完整的数据通过485发送完了吗?
				{
					Control485 = 1;    //485为发送模式;
					for(i=0;i<13;i++) 
					TCandata[i]=rec_232_R[BagCount_T_232][i]; //把存在外RAM的232数据调到内RAM,供CAN,485发送用
	 				SjaSend(TCandata);  //继续发送232已经接收到的数据到CAN 
	 				Sendto485(TCandata);//继续发送232已经接收到的数据到485
	 				TCount_232++; //累计发送次数
	 				BagCount_T_232++; //成功发送了前一232的数据,数据指针加一,开始发送没发送出去的数据
	 				if(BagCount_T_232>BadLenght) //计数已到最大值,重新开始从第一位读取接收回来的232数据
	 				BagCount_T_232=0;
	 				int_flag_485=0;  //清484接收完成标志
				}
			  rx_flag_232 = 0; //清232接收完成标志			
	  } 
	  else
    {
    	TCount_232 = 0;
    	RCount_232 = 0;
    }	
///232成功发送一字节数据//
    if(int_232)
    {
			if((length_232--)>0)
			{
				send_232++;  //发送指针指向下一要发送数据的地址
				SBUF=*send_232; //发送	
			}
			else
			{
				int_flag_232=1;//一帧数据发送完成
			}	 
      int_232=0;
	  }	  		
		  
///232成功接收一字节数据//
    if(rx_232)
    {
    	TR0=1; //开定时器0,(10MS后如果还没接收完13位数据就把之前接收的舍去)
			rec_232_R[BagCount_R_232][length_232_R] = SBUF;  //接收数据到232数据缓冲区
			length_232_R++;            //232接收个数加1
			if(length_232_R	== 13)     //接收完13个数据?(数据包括:4位ID, 1位的CAN数据长度,8位的CAN数据)
				{
					TR0=0;  //关定时器0,已经接收到13位数据了
				  TH0  = 0Xdc;  //10MS定时赋初值
					TL0  = 0X00; 
					rx_flag_232 = 1;      //成功接收,,置232成功接收标志,可以对CAN ,485发送了
					length_232_R = 0;     //232接收个数计数清0;
					RCount_232++;
					BagCount_R_232++;         //数据包计数加1
					if(BagCount_R_232>BadLenght)   //232接收缓冲区已满,调回到第一个区继续接收;
					BagCount_R_232=0;
				}			
			rx_232=0;
	  }
	     

	   
      
//////////////////////////////从485接收,发送到can,232///////////////////////////////////
		if (rx_flag_485 == 1 || RCount_485 > TCount_485 ) //485接收完成或485成功接收回来的数据都发送出去了吗?
		{	
				if(int_flag_232) //一帧完整的数据通过232发送完了吗?
				{
					for(i=0;i<13;i++) 
					TCandata[i]=rec_485_R[BagCount_T_485][i]; 
	 				SjaSend(TCandata);  //继续发送485已经接收到的数据到CAN 
	 				Sendto232(TCandata);//继续发送485已经接收到的数据到232
	 				TCount_485++; 
	 				BagCount_T_485++; //成功发送了前一485的数据,数据指针加一,开始发送没发送出去的数据
	 				if(BagCount_T_485>BadLenght)
	 				BagCount_T_485=0;
	 				int_flag_232=0;  //清232接收完成标志
				}
			  rx_flag_485 = 0; //清485接收完成标志
		}    
    else
    {
    	TCount_485 = 0;
    	RCount_485 = 0;
    }
///485成功发送一帧数据//
	  if(int_485)
	  {
	  	if((length_485--)>0)
			{
				send_485++;  //发送指针指向下一要发送数据的地址
				SBUF1 = *send_485; //发送
			}
			else
			{
				int_flag_485 = 1;//发送完成,允许发送新数据	
				Control485 = 0;    //485已经把数据发送完毕,把模式转为接收;
				length_485_R = 0;
			}
	  	int_485=0;
	  }
	  
///485成功接收一字节数据//	
    if(rx_485)
    {
    	TR0=1;   //开定时器0,(10MS后如果还没接收完13位数据就把之前接收的舍去)
    	rec_485_R[BagCount_R_485][length_485_R] = SBUF1;  //接收数据到485数据缓冲区
    	length_485_R++; //485接收个数加1      
			if(length_485_R	== 13)     //接收完13个数据?(数据包括4位ID, 1位的CAN数据长度,8位的CAN数据)
			{
				  TR0=0; //关定时器0,已经接收到13位数据了
				  TH0  = 0Xdc;  //10MS定时赋初值
					TL0  = 0X00; 
					rx_flag_485 = 1;      //成功接收,可以发送了,置485成功接收标志
					length_485_R = 0;      //485字节接收数清0;
					RCount_485++;          //485帧计数加1;
					BagCount_R_485++;         //数据包计数加1
					if(BagCount_R_485>BadLenght)   //485接收缓冲区已满,调回到第一个区继续接收;
	        BagCount_R_485=0;
			}	
			rx_485=0;		
		}		
     
 
	 	     
///////////////////从can接收,发送到485,232////////////////////////
		if (bSjaReceived ||RCount_CAN > TCount_CAN ) 
		{ 
			if(int_flag_232&&int_flag_485) //485,232把一帧完整的数据发送完成了吗?
			{
				Control485 = 1;    //485为发送模式;
				for(i=0;i<13;i++)   //外RAM的CAN数据调到内RAM
				TCandata[i]=Candata_R[Bagcount_T_CAN][i];
				Changetoadr();  //把CAN接收的地址转换为232,485能识别的地址
				Sendto232(TCandata);   //发送数据到232
				Sendto485(TCandata);   //发送数据到485
				TCount_CAN++;    //CAN发送次数加1
				Bagcount_T_CAN++;   //CAN发送指针加1
				if(Bagcount_T_CAN>BadLenght_can)  //CAN发送指针溢出
				Bagcount_T_CAN=0;  //重置CAN发送指针
				int_flag_232=0;   //清232发送完成标志
				int_flag_485=0;  //清485发送完成标志
			}
			bSjaReceived=0;		
		}
    else
    	{
    		RCount_CAN=0;
    		TCount_CAN=0;
    	}
	}
}


⌨️ 快捷键说明

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