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

📄 main.c

📁 我做的基于C8051F340的双串口转发程序。带有超时控制功能
💻 C
📖 第 1 页 / 共 2 页
字号:
			  Syn_flag=1;//indicate have recive syn flag
			  timer0=0;}//clear
		 if(Pc_Message[4]!=0x06&&Pc_Message[4]!=0x02)//SYN signal and  SYN2  signal
		    { // start timer0 for count the time piece
              TR0=0;
			  Syn_flag=0;//indicate have recive syn flag
			  timer0=0;}//clear
		 //retransfer data to radio   send messsges to radio 
		 len=0;
		 for(len=0;len<Pc_length;len++)
		   {
             SBUF0=Pc_Message[len];
			 while(!TI0);
			 TI0=0;
		   }
		// send over data by uart0  clear the pc_messages
		for(len=0;len<Pc_length;len++) Pc_Message[len]=0;
		//clear the pc flag enable uart1 receive data 
		Pc_Send_flag=0;//enable receive data from uart1
		Pc_flag=0;
		Pc_err_flag=0;
		Pc_ctr=0;
		Pc_length=0;
		Reset_Wdt();
      }
    if(Pc_err_flag==1)//received error message for uart1 timeout
	  { //clear all recevie messages from uart1 from pc
        len=0;
		for(len=0;len<100;len++) Pc_Message[len]=0;
		//clear pc err flag
		Pc_Send_flag=0;
		Pc_err_flag=0;
		Pc_flag=0;
		Pc_ctr=0;
		Pc_length=0;
		Reset_Wdt();
	  }
}
////////////////////////////////////////////////////////
void Time_Poll(void)//poll the time  if time is bigger than 
                    // time  then  send  analgyed messages to pc
{ 
    uint len;
	uint len2;
  	uint  crc;
	crc=0;//clear crc data
  if(timer0>=Time)//bigger than 时间片2500ms
   {
    TR0=0;//stop the timer0
	timer0=0;//clear   
     Reset_Wdt();
    if(flag1==1&&flag2==1)//have analgy the right message and error message
       {
	   Message[0]=0xAA;Message[1]=0x55;Message[2]=0x00;Message[3]=0x00;Message[4]=0x00;
        /////////  aa   55   00   00   00(flag)
 	   Message[5]=2+ store_error+store_right;//all data length
       for(len=6;len<6+store_right;len++)
	   Message[len]=Truck_Right[len-6];//copy data to message
	   Message[6+store_right]=0x00;//
       Message[7+store_right]=0x00;//the data 
	   for(len=8+store_right;len<8+store_right+store_error;len++)
       Message[len]=Truck_Error[len-8+store_right];
	   /////check crc
       crc=table_crc(Message+2,Message[5]+4);
	   Message[Message[5]+6]=crc&0x00ff;
       Message[Message[5]+7]=(crc&0xff00)>>8;
	   Message[Message[5]+8]=0x01;//end 
	   ///////////// send message to pc
	   for(len2=0;len2<Message[5]+8;len2++)
	   {  
	     SBUF1=Message[len2];
  	     while(SCON1!=0x32);
         SCON1&=~0x02;
	   }
	   flag1=0;flag2=0;
	   }
	//////////////////////////
	  if(flag1==1)//only have analgy the right message 
       {
	   Message[0]=0xAA;Message[1]=0x55;Message[2]=0x00;Message[3]=0x00;Message[4]=0x00;
        /////////  aa   55   00   00   00(flag)
 	   Message[5]=store_right;//all data length
       for(len=6;len<6+store_right;len++)
	   Message[len]=Truck_Right[len-6];
	   /////check crc
       crc=table_crc(Message+2,Message[5]+4);
	   Message[Message[5]+6]=crc&0x00ff;
       Message[Message[5]+7]=(crc&0xff00)>>8;
	   Message[Message[5]+8]=0x01;
	   ///send data
	    for(len2=0;len2<Message[5]+8;len2++)
	   {  
	     SBUF1=Message[len2];
  	     while(SCON1!=0x32);
         SCON1&=~0x02;
	   }
	   flag1=0;//clear
	   }
	  //////////////////////////////////
	  if(flag2==1)//only have analgy the error message
       {
	   Message[0]=0xAA;Message[1]=0x55;Message[2]=0x00;Message[3]=0x00;Message[4]=0x00;
        /////////  aa   55   00   00   00(flag)
 	   Message[5]=2+ store_error;//all data length
	   for(len=8;len<8+store_error;len++)
       Message[len]=Truck_Error[len-8];
	   /////check crc
       crc=table_crc(Message+2,Message[5]+4);
	   Message[Message[5]+6]=crc&0x00ff;
       Message[Message[5]+7]=(crc&0xff00)>>8;
	   Message[Message[5]+8]=0x01;
	   ///end
	   for(len2=0;len2<Message[5]+8;len2++)
	   {  
	     SBUF1=Message[len2];
  	     while(SCON1!=0x32);
         SCON1&=~0x02;
	   }//end for
	   flag2=0;//clear
	   }//end if
	////////////////////////////////////////////
	//clear all send messages
	for(len2=0;len2<500;len2++) Message[len2]=0;
	Reset_Wdt();
	for(len2=0;len2<400;len2++) Truck_Right[len2]=0;
	Reset_Wdt();
	for(len2=0;len2<100;len2++) Truck_Error[len2]=0;
	Reset_Wdt();
	store_right=0;
	store_error=0;
	flag1=0;
	flag2=0;
	Syn_flag=0;//not syn signal
   }
//clear all flags and messages for next receive message
}
///////////////////////////////////////////////////////////
/////main function///////////////////////
void main(void)
{
  Init_System();//initlized system
  while(1) 
   {
     Reset_Wdt();//reset watchdog
	 //////////////////////////////////////
     Uart0_TimeOut();//uarto timeout control
     Uart0_Message_Analgy();//analgy uart0 message
	 ///////////////////////////////////////
	 Uart1_TimeOut();//uart1 timeout control
	 Uart1_Message_Analgy();//analgy uart1  message
     ///////////////////////
     Time_Poll();//poll the timepiece
   }
}
////////ISR Routine///////////////////////
///Timer0 ISR  fuction////////////////////
void Timer0_ISR(void) interrupt 1 
{   TF0 = 0;
	TH0=0XF4;
	TL0=0X48;//1ms
	timer0=timer0+1;
}
///Uart0 ISR//////////////////////////////
void Uart0_ISR(void) interrupt  4 
{ 
   if(RI0)//with timeout controll
     { //receive  data from radio
	     RI0=0;
	     if(Radio_Send_flag==0)//enable receive data from radio
		 {
		   if(Radio_ctr<MaxLength)//data lenght must be small MaxLength
		    { 
			  TMR2CN = 0x04; //enable time2 FOR controll uart0 timeout
			  timer2=0;//clear
		      Radio_Message[Radio_ctr]=SBUF0;
		      Radio_ctr=Radio_ctr+1;//count
		      if(Radio_ctr==6) Radio_length=9+Radio_Message[5];//data length
		      if(Radio_ctr==Radio_length)//receive the length data
		         {
                     if(Radio_Message[0]==0xAA&&Radio_Message[1]==0x55&&Radio_Message[Radio_length-1]==0x01)//right data
					    // set has received data flag from radio
					    {
                        TMR2CN=0X00;//disable timer2 for uart0 timeout
					    timer2=0;//clear timer2
                        Radio_flag=1;//mean have received data from radio
                        Radio_Send_flag=1;//disable receive data from radio
                        Radio_ctr=0;//clear the counter
                        }
		          }
			  }
         }
	    
	 }
//  if(TI0)
//     { //send data to radio
//	    TI0=0;
	  
 //     }
}
///timer2 isr///////////////////////////////
//controll uart0 timeout
void Timer2_ISR (void) interrupt 5
{
   TF2H = 0;
   timer2=timer2+1;// increduce by 1ms  
}
///TIMER3 ISR///////////////////////////////
//controll uart1 timeout
void Timer3_ISR (void) interrupt 14
{
   TMR3CN &=0x7F; 
   timer3=timer3+1;//added by 1ms            
}
///Uart1 ISR////////////////////////////////
void Uart1_ISR(void) interrupt 16 
{  
   if(SCON1&0x01==0x01)
     {  //receive data from pc
	    SCON1&=~0x01; 
		if(Pc_Send_flag==0)//enable receive data from pc
		 {
		   if(Pc_ctr<MaxLength)//data lenght must be smaller compare MaxLength
		    { 
			  TMR3CN = 0x04; //enable timer3 for controll uart1 timeout
			  timer3=0;//clear
		      Pc_Message[Pc_ctr]=SBUF1;
		      Pc_ctr=Pc_ctr+1;//count
		      if(Pc_ctr==6) Pc_length=9+Pc_Message[5];//data length
		      if(Pc_ctr==Pc_length)//receive the length data
		         {
                   if(Pc_Message[0]==0xAA&&Pc_Message[1]==0x55&&Pc_Message[Pc_length-1]==0x01)//receive right data
			         {
                        TMR3CN=0X00;//disable timer3
					    timer3=0;//clear timer3 for uart1 timeout
					    Pc_flag=1;//mean have received data from pc
						Pc_Send_flag=1;//
                        Pc_ctr=0;
				     }
		          }
			  }
         }
	 }
//   if(SCON1==0x32)
 //    {  //send data to pc
//	    SCON1&=~0x02;
 
	   
//	 }
}

⌨️ 快捷键说明

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