📄 _rs485.c
字号:
{ 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 + -