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

📄 _rs485.c

📁 全自动剥线机(C语言源码+DOC文档说明)
💻 C
📖 第 1 页 / 共 2 页
字号:
               { break; } /* break out the 3 times frame transfer.   */
               else
               {
                  d_datatrok = FALSE;
                  g_char_ptr = g_char_ptr-CN_FRAME;
                  g_uintreg0 = g_uintreg0-CN_FRAME;
               }
            }
         }
         if(d_datatrok==FALSE)
         { break; }
      }
   }
   Delay_Set(CN_2ms);
   AD_485TR = CN_TR_EN; /* the MAX487E transmit enable. */
   Delay_Set(CN_2ms);
   TB8 = 1;
   SBUF = CN_COMMOK; /* reset the sub machine to the start status. */
   while( TI!=1 );
   TI = 0;
   i = CN_TIMER1; /* delay 1 ms . */
   while ( i > 0 )
   i --;
   AD_485TR = CN_RE_EN; /* the MAX487E receive enable. */

   return d_datatrok;
}

/***************************************************************************

NAME:       Rece_Handle

FUNCTION:   This procedure will do the data receive setting.

INPUTS:     NONE

OUTPUTS:    NONE

***************************************************************************/
void Rece_Handle()
{
   Init_Rs232();
   AD_485TR = CN_RE_EN; /* the MAX487E receive enable.   */
   g_rece_status = CN_ADDR_HANDLE;
   SM2 = 1;  /* assure only the address can be received. */
   g_rece_flash = CN_RECE_FON;
}

/***************************************************************************

NAME:       SCON_int

FUNCTION:   This procedure will handle rs232 serial port interrupt.

INPUTS:     NONE

OUTPUTS:    on_time

***************************************************************************/
void serial() interrupt 4 using 1
{
   uchar xdata *d_char_ptr;
   uint  xdata *d_uint_ptr;
   uchar i;
   bit   d_receOK;

   if(RI==1)
   {
      RI = 0; /* clear the RI flag. */
      if(RB8==1 && SM2==0)
      {
      	 g_rece_status = CN_ADDR_HANDLE;
         SM2 = 1; /* assure only the address can be received. */
         g_rece_flash = CN_RECE_FON;
      }
      else
      {
         switch(g_rece_status)
         {
            case CN_ADDR_HANDLE:
                 i = SBUF;
                 d_char_ptr = (uchar xdata *)AD_MACHNO;
                 if(*d_char_ptr==i) /* it is the destination machine. */
         	 {
         	    g_rece_flash = CN_RECE_FOFF;  /* unshow the receiving flag. */
         	    SM2 = 0; /* receive data enable. */
                    TB8 = 1; /* return the address but not data. */
                    g_rece_status = CN_DATAHEAD_HANDLE;
                    g_rece_counter = 0;
                    g_sum_of_value = 0;
                    i = CN_TIMER1; /* delay 1 ms . */
                    while ( i > 0 )
                    i --;
                    i = CN_TIMER1; /* delay 1 ms . */
                    while ( i > 0 )
                    i --;
                    AD_485TR = CN_TR_EN; /* the MAX487E transmit enable.   */
                    i = CN_TIMER1; /* delay 1 ms . */
                    while ( i > 0 )
                    i --;
         	    SBUF = *d_char_ptr; /* return the machine address. */
	         }
                 break;
            case CN_DATAHEAD_HANDLE:
                 switch(g_rece_counter)
                 {
                    case 0:
                         g_rece_char = SBUF;
                         g_rece_counter++;
                         g_sum_of_value = g_sum_of_value+g_rece_char;
                         break;
                    case 1:
                         g_rece_char0 = SBUF;
                         g_rece_counter++;
                         g_sum_of_value = g_sum_of_value+g_rece_char0;
                         break;
                    case 2:
                         i = SBUF;
                         g_sum_of_byte = i; /* get the start progm NO. high byte. */
                         g_rece_counter++;
                         g_sum_of_value = g_sum_of_value+(uchar)g_sum_of_byte;
                         break;
                    case 3:
                         i = SBUF; /* get the start progm NO. low byte. */
                         g_sum_of_byte = g_sum_of_byte*256+i;
                         g_rece_counter++;
                         g_sum_of_value = g_sum_of_value+i;
                         break;
                    case 4:
                         i = SBUF;
                         g_rece_uint = i; /* get the last progm NO. high byte. */
                         g_rece_counter++;
                         g_sum_of_value = g_sum_of_value+(uchar)g_rece_uint;
                         break;
                    case 5:
                         i = SBUF; /* get the last progm NO. low byte. */
                         g_rece_uint = g_rece_uint*256+i;
                         g_rece_counter++;
                         g_sum_of_value = g_sum_of_value+i;
                         break;
                    case 6:
                         i = SBUF;
                         TB8 = 0;
                         if(g_sum_of_value==i) /* the data head receive OK. */
                         {
                            /* the following calculate the start address and byte numb. */
                            d_receOK = TRUE; /* default sub can receive data OK. */
                            if(g_rece_char!=CN_SEGSET) /* receive all the program. */
                            {
                               g_receive_ptr = (uchar xdata *)AD_PROGRAM;
                               g_sum_of_byte = AD_LASTRAM-AD_PROGRAM+1;
                            }
                            else /* segment receive. */
                            {
                               if(g_rece_char0!=CN_LASTSHOW)
                               {
                                  g_rece_uint = g_sum_of_byte;
                               }
                               if(g_transall!=CN_SEGSET) /* sub receive all setting. */
                               {
                                  i = 0;
                                  if(g_sum_of_byte<CN_COMPROG)
                                  { i = 0; }
                                  if(g_sum_of_byte>=CN_COMPROG)
                                  { i = 1; }
                               	  switch(i)
                               	  {
                               	     case 0:
                               	     	  g_receive_ptr = (uchar xdata *)(AD_PROGRAM+
                               	     	                  g_sum_of_byte*CN_COMBYTE);
                                          g_sum_of_byte = (g_rece_uint-g_sum_of_byte+1)
                                                         *CN_COMBYTE;
                               	          break;
                               	     case 1:
                               	          g_receive_ptr = (uchar xdata *)(AD_MIDSRAM+
                               	                          (g_sum_of_byte-CN_COMPROG)
                               	                         *CN_MIDBYTE);
                                          g_sum_of_byte = (g_rece_uint-g_sum_of_byte+1)
                                                         *CN_MIDBYTE;
                                          break;
                               	  }
                               }
                               else /* sub machine receive segment setting. */
                               {
                               	  i = 2;
                               	  d_receOK = FALSE;
                               	  d_uint_ptr = (uint xdata *)AD_STARTTRAN;
                                  if(g_sum_of_byte<CN_COMPROG && ((*d_uint_ptr)<CN_COMPROG))
                                  { d_receOK = TRUE; i = 0; }
                                  else
                                  if(g_sum_of_byte>=CN_COMPROG && ((*d_uint_ptr)>=CN_COMPROG))
                                  { d_receOK = TRUE; i = 1; }
                               	  switch(i)
                               	  {
                               	     case 0:
                               	     	  d_uint_ptr = (uint xdata *)AD_STARTTRAN;
                                          if((CN_COMPROG-(*d_uint_ptr)-1)>=g_rece_uint-g_sum_of_byte)
                               	          {
                               	             g_receive_ptr = (uchar xdata *)(AD_PROGRAM+
                               	     	                     (*d_uint_ptr)*CN_COMBYTE);
                                             g_sum_of_byte = (g_rece_uint-g_sum_of_byte+1)
                                                            *CN_COMBYTE;
                                          }
                                          else
                                          { d_receOK = FALSE; }
                               	          break;
                               	     case 1:
                               	          d_uint_ptr = (uint xdata *)AD_STARTTRAN;
                                          if((CN_PROGTOTAL-(*d_uint_ptr))>=g_rece_uint-g_sum_of_byte)
                               	          {
                                             g_receive_ptr = (uchar xdata *)(AD_MIDSRAM+
                               	                             ((*d_uint_ptr)-CN_COMPROG)
                               	                            *CN_MIDBYTE);
                               	             g_sum_of_byte = (g_rece_uint-g_sum_of_byte+1)
                                                            *CN_MIDBYTE;
                               	          }
                               	          else
                               	          { d_receOK = FALSE; }
                               	          break;
                               	     default:
                               	          break;
                               	  }
                               }
                            }
                            if(d_receOK==TRUE)
                            {
                               i = CN_TIMER1; /* delay 1 ms . */
                               while ( i > 0 )
                               i --;
                               i = CN_TIMER1; /* delay 1 ms . */
                               while ( i > 0 )
                               i --;
                               AD_485TR = CN_TR_EN; /* the MAX487E transmit enable. */
                               i = CN_TIMER1; /* delay 1 ms . */
                               while ( i > 0 )
                               i --;
                               g_rece_status = CN_DATA_HANDLE;
                               g_rece_char0 = 0;  /* use for flash counter. */
                               g_sum_of_value = 0; /* use for the frame summary check */
                               g_rece_counter = 0; /* use for the frame byte counter. */
                               g_rece_uint = 0;    /* use for the comm byte counter.  */
                               SBUF = CN_COMMOK;
                            }
                            else
                            {
                               i = CN_TIMER1; /* delay 1 ms . */
                               while ( i > 0 )
                               i --;
                               i = CN_TIMER1; /* delay 1 ms . */
                               while ( i > 0 )
                               i --;
                               AD_485TR = CN_TR_EN; /* the MAX487E transmit enable. */
                               i = CN_TIMER1; /* delay 1 ms . */
                               while ( i > 0 )
                               i --;
                               g_rece_status = CN_DATAHEAD_HANDLE;
                               SBUF = CN_COMMERR;
                            }
                         }
                         else
                         {
                            i = CN_TIMER1; /* delay 1 ms . */
                            while ( i > 0 )
                            i --;
                            i = CN_TIMER1; /* delay 1 ms . */
                            while ( i > 0 )
                            i --;
                            AD_485TR = CN_TR_EN; /* the MAX487E transmit enable. */
                            i = CN_TIMER1; /* delay 1 ms . */
                            while ( i > 0 )
                            i --;	
                            g_rece_status = CN_DATAHEAD_HANDLE;
                            SBUF = CN_COMMERR;
                         }
                         break;
                    default:
                         break;
                 }
                 break;
            case CN_DATA_HANDLE:
                 i = SBUF;
                 if(g_rece_counter<CN_FRAME)
                 {
                    if(g_rece_uint<g_sum_of_byte)
                    {
                      *g_receive_ptr = i;
                      *g_receive_ptr = i; /* write once more. */
                       for(;;)
                       {
                          AD_WDG = 1;
                          if(*g_receive_ptr==i)
                          { break; }
                         *g_receive_ptr = i;
                          AD_WDG = 0;
                       }
                    }
                    g_rece_counter++;
                    g_rece_uint++;
                    g_sum_of_value = g_sum_of_value+i;
                   *g_receive_ptr++;
                 }
                 else  /* the frame summany data handle. */
                 {
                    g_rece_char = SBUF;
                    i = CN_TIMER1; /* delay 1 ms . */
                    while ( i > 0 )
                    i--;
                    i = CN_TIMER1; /* delay 1 ms . */
                    while ( i > 0 )
                    i--;
                    AD_485TR = CN_TR_EN; /* the MAX487E transmit enable. */
                    i = CN_TIMER1; /* delay 1 ms . */
                    while ( i > 0 )
                    i--;
                    g_rece_status = CN_DATA_HANDLE;
                    i = g_sum_of_value;
                    g_sum_of_value = 0; /* use for the frame summary check */
                    g_rece_counter = 0; /* use for the frame byte counter. */
                    g_rece_char0++;
                    if(g_rece_char0>=CN_COMMFLASH) /* flash to show the communication is on going.*/
                    {
                       g_rece_char0 = 0;	
                       if(g_rece_flash==CN_RECE_FONOVER || g_rece_flash==CN_RECE_FON)
                       {
                          g_rece_flash = CN_RECE_FOFF;  /* unshow the receiving flag. */
                       } 
                       else if(g_rece_flash==CN_RECE_FOFFOVER || g_rece_flash==CN_RECE_FOFF)
                       {
                          g_rece_flash = CN_RECE_FON; /* show the receiving flag. */
                       }
                    }        
                    if(i==g_rece_char) /* this frame receive OK. */
                    { SBUF = CN_COMMOK; }
                    else
                    {
                       g_receive_ptr = g_receive_ptr-CN_FRAME;
                       g_rece_uint = g_rece_uint-CN_FRAME;
                       SBUF = CN_COMMERR;
                    }
                 }
                 break;
            default:
                 break;
         }
      }
   }
   else
   {
      TI = 0; /* clear the TI flag. */
      i = CN_TIMER1; /* delay 1 ms . */
      while ( i > 0 )
      i--;
      AD_485TR = CN_RE_EN; /* the MAX487E receive enable.   */
   }

}




/**************************************************************************
Edit by:
FRANK	                             		      20040103  ShenZhen
**************************************************************************/

⌨️ 快捷键说明

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