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

📄 main.c

📁 我做的基于C8051F340的双串口转发程序。带有超时控制功能
💻 C
📖 第 1 页 / 共 2 页
字号:
//////////////////////////////////////////
///////////UartVesion 1.0/////////////////////
//////////////////////////////////////////
///////////headers ///////////////////////
#include "crc.H"//included device lib////

/////function////////////////////////////
//Timeout
// control the timeout
#define TimeOut 3       //3ms timeout
#define MaxLength 100   //max data length
#define Time      2500//2.5s
//computer
/////pc_send_flag=0..enable receive data from pc
/////pc_send_flag=1..disable receive data from pc
bit Pc_Send_flag;//0 enable receive  1  enable send 
bit Pc_flag;//receive pc right data flag
bit Pc_err_flag;// receive pc error data flag
uchar Pc_ctr;//pc data counter
uchar xdata Pc_Message[100];//receive pc data buffers
uchar Pc_length;//receive pc data length

//radio
/////radio_send_flag=0..enable receive data from radio
/////radio_send_flag=1..disable receive data from radio
bit Radio_Send_flag;//
bit Radio_flag;//receive pc data flag
bit Radio_err_flag;//receive radio error flag
uchar Radio_ctr;//pc data counter
uchar xdata Radio_Message[100];//receive pc data buffers
uchar Radio_length;//receive pc data length

///////////for store the messages for car
uchar store_right;
uchar store_error;
uchar  xdata   Truck_Right[400];
uchar  xdata   Truck_Error[100];
bit  Syn_flag;//SYN_FLAG=1 表示已经收到了同步信号  syn_flag=0
bit   flag1;
bit   flag2;//indicate have done analgy the messages
uchar  TimePiece;//counter the receive data time
//////////////
uchar xdata Message[500];//the messages be send to pc 
//timer1
uint timer0;//count the time when received data from radio


//timer2
uchar timer2;//count the time for control uart0 timeout

//timer3
uchar timer3;//count the time for control uart1 timeout

///////////////////////////////////////////////////////////
void Uart0_TimeOut(void); //uarto receive data timeout
void Uart1_TimeOut(void); //uart1 receive data timeout
void Uart0_Message_Analgy(void);//analgy the uart0 message
void Uart1_Message_Analgy(void);//analgy the uart1 message 
void Coventer_Time(void);//coventer the count time to timepiece

/////////////////////////////////////////////////////////
void Coventer_Time(void)
{
  uchar n;
  for(n=0;n<50;n++)
  { 
   if(timer0>155+45*n&&timer0<155+45*(n+1))//count time
     {
      TimePiece=n;
	  break; // have find timepiece  break
	 }//end  if
  }//end for
}
//////////////////////////////////////////////////////////
void Uart0_TimeOut(void)
{
  if(timer2>3)//uart0 has timeout 3ms
    {  
	   TMR2CN=0x00;//disable timer2 for uart0 timeout
	   timer2=0;//clear timer2
       Radio_err_flag=1;//error flag for timeout
	}
}
/////////////////////////////////////////////////////////
void Uart1_TimeOut(void)
{
  if(timer3>3)//uart0 has timeout 3ms
    {  
	   TMR3CN=0x00;//disable timer2 for uart0 timeout
	   timer3=0;//clear timer2
       Pc_err_flag=1;//error flag for timeout
	}
}
////////////////////////////////////////////////////////
void Uart0_Message_Analgy(void)
{   
    uchar len;
    uint  crc;
	uchar crc_l;
	uchar crc_h;
	crc=0;crc_l=0;crc_h=0;//clear crc data
  if(Syn_flag==1)//has receive syn signal 在收到同步信号的时候,解析收到的终端按键信息
   {             //把错误和正确的卡车信息储存起来
    if(Radio_flag==1)//received right message from radio
	  {
	     ///有按键的时候 且正确的   储存信息 的情况 // 登陆 确认 功能
	   if(Radio_Message[4]==16||Radio_Message[4]==17||Radio_Message[4]==18)//接收到的信息有按键的时候 先假如FLAG=21
	    {
         if(Radio_Message[0]==0xAA&&Radio_Message[1]==0x55&&Radio_Message[Radio_length-1]==0x01)//receive right data
			{   //check crc 
                crc=table_crc(Radio_Message+2,Radio_length-5);
			    crc_l=crc&0x00ff;
				crc_h=(crc&0xff00)>>8;
				if(crc_l==Radio_Message[Radio_length-3]&&crc_h==Radio_Message[Radio_length-2])//crc check right
				  { 
				    Coventer_Time();// transfer timer0 to timepiece
                    Truck_Right[store_right]=Radio_Message[Radio_length-7];//truck id low
					Truck_Right[store_right++]=Radio_Message[Radio_length-6];//truck id hight
                    Truck_Right[store_right++]=Radio_Message[4];//key
					Truck_Right[store_right++]=TimePiece;//store the timepiece
					store_right=store_right+4;//pointer added
					flag1=1;
                  }
				else //crc check error
				  { 
				    Coventer_Time();//transfer timer0 to timepiece
                    Truck_Error[store_error]=TimePiece;//store the error truck
                    store_error=store_error+1;//pointer add
					flag2=1;
				  }
				//clear all messages
				Radio_Send_flag=0;//enable receive the messages from uart0
				Radio_ctr=0;
				Radio_err_flag=0;
				Radio_flag=0;//clear the right message flag
				for(len=0;len<Radio_length;len++) Radio_Message[len]=0;
				Radio_length=0;
                Reset_Wdt();
			}//end the header is right
	  }//end  Radio_Message[4]==21 
		///其他信息的情况,直接转发给PC 接收的信息没有KEY FLAG
       else
	   {
        for(len=0;len<Radio_length;len++)
	     {  
	     SBUF1=Radio_Message[len];
  	     while(SCON1!=0x32);
         SCON1&=~0x02;
	     }
	   /////
	    Radio_Send_flag=0;//enable receive the messages from uart0
		Radio_ctr=0;
		Radio_err_flag=0;
		Radio_flag=0;//clear the right message flag
		for(len=0;len<Radio_length;len++) Radio_Message[len]=0;
		Radio_length=0;
		Reset_Wdt();
       }//end else
	  }//end radio flag=1
	if(Radio_err_flag==1)//receivd error message for uart0 timeout
	  { 
	    ///错误的情况 有按键的情况下
	 // if(Radio_Message[4]==21)//
	 //  {
	    timer0=timer0-3;//because the timeout is 3 ms
	    Coventer_Time();//transfer timer0 to timepiece
        Truck_Error[store_error]=TimePiece;//store the error truck
        store_error=store_error+1;//pointer add
		flag2=1;
		////clear all
	    Radio_err_flag=0;//clear the error flag
		Radio_flag=0;
		Radio_Send_flag=0;
		Radio_ctr=0;
        for(len=0;len<Radio_length;len++) Radio_Message[len]=0;
		Radio_length=0;
		Reset_Wdt();
	   //}
		////错误的情况 没有按键的情况下
     /* else
	   { 
	    for(len=0;len<Radio_length;len++)
	      {  
	       SBUF1=Radio_Message[len];
  	       while(SCON1!=0x32);
           SCON1&=~0x02;
	       }
	    /////
	    Radio_Send_flag=0;//enable receive the messages from uart0
		Radio_ctr=0;
		Radio_err_flag=0;
		Radio_flag=0;//clear the right message flag
		for(len=0;len<Radio_length;len++) Radio_Message[len]=0;
		Radio_length=0; 
    	Reset_Wdt();
       }//end else*/
	 }//end radio error flag=1
	}//end syn_flag=1
  else // syn_flag=0 没有收到同步信号的情况下
    {  //直接转发数据给PC
      if(Radio_flag==1)//接收情况正确的情况下
	   {
        Radio_flag=0;
		for(len=0;len<Radio_length;len++)
	    {  
	     SBUF1=Radio_Message[len];
  	     while(SCON1!=0x32);
         SCON1&=~0x02;
	    }
	    //////////////////////
        Radio_err_flag=0;//clear the error flag
		Radio_flag=0;
		Radio_Send_flag=0;
		Radio_ctr=0;
        for(len=0;len<Radio_length;len++) Radio_Message[len]=0;
		Radio_length=0;
		Reset_Wdt();
       }
      if(Radio_err_flag==1)//接收超时的情况下
	   {
         Radio_err_flag=0;
		 for(len=0;len<Radio_length;len++)
	     {  
	     SBUF1=Radio_Message[len];
  	     while(SCON1!=0x32);
         SCON1&=~0x02;
	     }
	    //////////////////////
        Radio_err_flag=0;//clear the error flag
		Radio_flag=0;
		Radio_Send_flag=0;
		Radio_ctr=0;
        for(len=0;len<Radio_length;len++) Radio_Message[len]=0;
		Radio_length=0;
		Reset_Wdt();
      }
	}//end else
}
////////////////////////////////////////////////////////
void Uart1_Message_Analgy(void)
{    
    uchar len;
	uint  crc;
	uchar crc_l;
	uchar crc_h;
	len=0;//clear data len for send data to radio
	crc=0;crc_l=0;crc_h=0;//clear crc data
    if(Pc_flag==1)//received right message from pc
	  {
         if(Pc_Message[4]==0x06||Pc_Message[4]==0x02)//SYN signal and  SYN2  signal
		    { // start timer0 for count the time piece
              TR0=1;

⌨️ 快捷键说明

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