📄 acomm.c
字号:
uchar readgsm( uchar * b )
{
//uchar a ;
if( s_tail != s_head )
{
* b = gsmout[s_tail] ;
s_tail++ ;
if( s_tail == GSML )
s_tail = 0 ;
return 1 ;
}
else
return 0 ;
}
uchar readtest( uchar * b )
{
uchar a ;
if( t_tail != t_head )
{
*b = testout[t_tail] ;
t_tail++ ;
if( t_tail == GSML )
t_tail = 0 ;
return 1 ;
}
else
return 0 ;
}
uchar readtel( uchar * b )
{
if( l_tail != l_head )
{
*b = telout[l_tail] ;
l_tail++ ;
if( l_tail == TELL )
l_tail = 0 ;
return 1 ;
}
else
return 0 ;
}
uchar readgps( uchar * b )
{
uchar a ;
if( g_tail != g_head )
{
*b = gpsout[g_tail] ;
g_tail++ ;
if( g_tail == GPSL )
g_tail = 0 ;
return 1 ;
}
else
return 0 ;
}
void stringsendgsm(uchar *rt )
{
uint len,i ;
len = strlen(rt) ;
for(i=0;i<len;i++)
sendgsm(rt[i]) ;
sendgsm( 0x0d ) ;
sendgsm( 0x0a ) ;
}
void timer0() interrupt 1
{
uchar a ;
// TL0 = 0x00 ;
// TH0 = 0xdc ;
TL0 = 0x00 ;
TH0 = 0xf7 ;
while(1)
{
a=SIOC[5];
if( a&0x01 == 0x01)
{
telout[l_head] = SIOC[0] ;
l_head++ ;
if( l_head == TELL )
l_head = 0 ;
if( l_head == l_tail )
l_tail++ ;
if( l_tail == TELL )
l_tail = 0 ;
}
break ;
}
timer101 = !timer101 ;
if( timer101 )
return ;
timer102 = !timer102 ;
if( timer102 )
return ;
timer_watchdog++ ;
if( stop_state != 0 )
{ stop_state-- ;
gpserr++ ;
}
else
gpserr=0 ;
if( ( timer_watchdog< 6000 ) && ( P10Enable == 1 ) )
P10 = !P10 ;
if(timer_0!=0)
timer_0--;
if(in_timer!=0)
in_timer--;
if ( timer_2 != 0 )
timer_2-- ;
if ( timer_4 != 0 )
timer_4-- ;
IN1 = ( bit )( PARA[0] & 0x01 ) ;
IN2 = ( bit )( PARA[0] & 0x02 ) ;
IN3 = ( bit )( PARA[0] & 0x04 ) ;
IN4 = ( bit )( PARA[0] & 0x08 ) ;
HA = ( bit )( PARA[0] & 0x10 ) ;
DES = ( bit )( PARA[0] & 0x20 ) ;
CHK = ( bit )( PARA[0] & 0x40 ) ;
// if ( hsent )
{
if( HA == 0 )
{
if( hand_alerm < HANDTIME )
hand_alerm++ ;
}
else
if( hand_alerm > 0 )
hand_alerm-- ;
}
// if ( asent )
{
if( IN1 == 0 )
{
if( door_state < 100 )
door_state++ ;
}
else
if( door_state > 0 )
door_state-- ;
if( CHK == 1 )
{
if(wire_state < 100 )
wire_state++ ;
}
else
if( wire_state > 0 )
wire_state-- ;
if( DES == 1 )
if( remove_state < 100 )
remove_state++ ;
else
if( remove_state > 0 )
remove_state-- ;
if( IN3 == 0 )
{
if( fire_state < 100 )
fire_state++ ;
}
else
if( fire_state > 0 )
fire_state-- ;
if( IN4 == 0 )
{
if( alermed < 100 )
alermed++ ;
}
else
if( alermed > 0 )
alermed-- ;
if( T0 == 1 )
{
if( v12_state < 100 )
v12_state++ ;
}
else
if( v12_state > 0 )
v12_state-- ;
}
}
void rtxd(uchar *rt )
{
uchar len,i ;
len = strlen(rt) ;
for(i=0;i<len;i++)
sendtest(rt[i]) ;
sendtest( 0x0d ) ;
sendtest( 0x0a ) ;
}
void sendtelstr(uchar *rt )
{
uint len,i;
len = strlen(rt) ;
for(i=0;i<len;i++)
sendtel(rt[i]);
sendtel( 0x0d ) ;
sendtel( 0x0a ) ;
}
void Init554()
{
P15=POWERON;
P14 = 1 ;
// T1=0 ;
timer_0 = 100 ;
while ( timer_0 !=0 ) ;
P14 = 0 ;
// T1=1 ;
timer_0 = 40 ;
while ( timer_0 !=0 ) ;
SIOA[4] = 0x08 ; /*MODEM CONTROL REGISTER,INT enable*/
SIOA[3] = 0x80 ; /*divisor latch enable*/
SIOA[0] = BaudA_l ; /*LSB OF DIVISOR LATCH*/
SIOA[1] = BaudA_h ; /*MSB OF DIVISOR LATCH*/
SIOA[3] = 0x03 ; /*8 BIT WORD LENGTH*/
SIOA[4] = 0x0b ; /*INT ENABLE FORCE RTS,DTR="0" */
SIOA[1] = 0x01 ;
SIOB[4] = 0x08 ;
SIOB[3] = 0x80 ;
SIOB[0] = BaudB_l ;
SIOB[1] = BaudB_h ;
SIOB[3] = 0x03 ;
SIOB[4] = 0x0b ;
SIOB[1] = 0x01 ;
SIOC[4] = 0x08 ;
SIOC[3] = 0x80 ;
SIOC[0] = BaudC_l ;
SIOC[1] = BaudC_h ;
SIOC[3] = 0x03 ;
SIOC[4] = 0x0b ;
SIOC[2] = 0xc1 ;
SIOC[1] = 0x01 ;
f_init554=1;
}
void ext_int0() interrupt 0
{
uchar a ;
a = SIOA[2] ;
if( a == 0x04 )
{
testout[t_head] = SIOA[0] ;
t_head++ ;
if( t_head == LCDL )
t_head = 0 ;
if( t_head == t_tail )
t_tail++ ;
if( t_tail == LCDL )
t_tail = 0 ;
}
}
void ext_int1() interrupt 2
{
uchar a ;
a = P88R[0]&0x0f ;
if( a == 0x0a )
a = '0' ;
else if( ( a > 0 )&&( a < 0x0a ) )
a = a+0x30 ;
else if( a == 0x0b )
a = '*' ;
else if( a == 0x0c )
a = '#' ;
else
a = 'F' ;
gpsout[g_head] = a ;
g_head++ ;
if( g_head == GPSL )
g_head = 0 ;
if( g_head == g_tail )
g_tail++ ;
if( g_tail == GPSL )
g_tail = 0 ;
}
/*
void ext_int1() interrupt 2
{
uchar xdata a ;
a = SIOB[2] ;
if( a == 0x04 )
{
gpsout[g_head] = SIOB[0] ;
g_head++ ;
if( g_head == GPSL )
g_head = 0 ;
if( g_head == g_tail )
g_tail++ ;
if( g_tail == GPSL )
g_tail = 0 ;
}
}
*/
void serial() interrupt 4
{
if( RI )
{
RI = 0 ;
gsmout[s_head] = SBUF ;
s_head++ ;
if( s_head == GSML )
s_head = 0 ;
if( s_head == s_tail )
s_tail++ ;
if( s_tail == GSML )
s_tail = 0 ;
}
else if( TI )
{
if( s_send==0 )
TI = 0 ;
}
}
/*
void Text2PDU( uchar *s,uchar *d )
{
uchar xdata temp[400] ;
uint ls,i,j,k ;
ls = strlen( s ) ;
temp[0] = ls ;
k = 1 ;
for( i=0 ; i<ls ; i+=8 )
{
for( j=0 ; j<7 ; j++ )
{
if( ( i+j+1 ) < ls )
temp[k] = ( s[i+j] >> j ) | ( s[i+j+1] << ( 7-j ) ) ;
else
{
temp[k] = s[i+j] >> j ;
k++ ;
break ;
}
k++ ;
}
}
j = 0 ;
for( i=0 ; i<k ; i++ )
{
d[j] = ( temp[i] >> 4 ) & 0x0f ;
if( d[j] < 0x0a )
d[j] += 0x30 ;
else
d[j] += 0x37 ;
j++ ;
d[j] = temp[i] & 0x0f ;
if( d[j] < 0x0a )
d[j] += 0x30 ;
else
d[j] += 0x37 ;
j++ ;
}
d[j] = 0 ;
}
*/
void PDU2Text( uchar *s,uchar *d )
{
uchar xdata temp[400] ;
uint data ls,i,j,k ;
ls = strlen( s ) ;
ls /= 2 ;
ls -= 1 ;
j = 2 ;
for( i=0 ; i<ls ; i++ )
{
if( s[j] <'A' )
temp[i] = ( s[j] - 0x30 ) << 4 ;
else
temp[i] = ( s[j] - 0x37 ) << 4 ;
j++ ;
if( s[j] <'A' )
temp[i] = temp[i] | ( s[j] - 0x30 ) ;
else
temp[i] = temp[i] | ( s[j] - 0x37 ) ;
j++ ;
}
k = 0 ;
for( i=0 ; i<ls ; i+=7 )
{
d[k] = temp[i] & 0x7f ;
k++ ;
for( j=0 ; j<6 ; j++ )
{
if( ( i+j+1 ) < ls )
{
d[k] = ( temp[i+j] >> ( 7-j ) | ( temp[i+j+1] << ( j+1 ) ) ) & 0x7f ;
k++ ;
}
else
break ;
}
if( ( ( i+j+1 ) < ls ) || ( j == 6 ) )
{
d[k] = temp[i+j] >> 1 ;
k++ ;
}
}
d[k] = 0 ;
}
void ProcessNoC( void )
{
at_talk = 0 ;
in_call = 0 ;
autohand = 0 ;
listen_alm = 0 ;
out_call = 0 ;
if( needsms == 1 )
{ count = 0 ;
send_time = PERIOD ;
timer_2 = PERIOD ;
}
}
void ProcessRing( void )
{
char i,a,b,j,c[50],d[50] ;
in_timer = 500 ;
in_call = 1 ;
autohand = 0 ;
out_call = 0 ;
listen_alm = 0 ;
at_talk = 0 ;
strcpy( c,"TTL7" ) ;
while( 1 )
{
timer_0 = 100 ;
gsmp = 0;
while( timer_0 )
{
a = readgsm( &b ) ;
if( a )
{
gsmproc[gsmp] = b ;
if( IN2 == 0 )
sendtest( b ) ;
if( gsmp < (GSMP-1) )
gsmp++ ;
if( b == 0x0a )
break ;
}
}
if( !timer_0 )
{
gsmerr++ ;
break ;
}
else if( ( gsmproc[0] == '+' ) && ( gsmproc[1] == 'C' ) && ( gsmproc[2] == 'L' ) && ( gsmproc[3] == 'I' ) )
{
for( i=8;i<25;i++ )
{
if( gsmproc[i] != '"' )
c[i-4] = gsmproc[i] ;
else
{
c[i-4] = 0 ;
break ;
}
}
break ;
}
}
sendtelstr( c ) ;
substr( c,d,4,strlen(c)-4 ) ;
rtxd( d ) ;
rtxd( listen_code1 ) ;
i = strcmp( d,listen_code1 ) ;
if( i == 0 )
autohand = 1 ;
}
void DeleteGsmData( void )
{ uchar data i,a,b,j ;
if( del_mark==0 ) return ;
for( i=0 ; i<30 ; i++ )
{
if( del_index[i] != 0 )
{
for( j=0 ; j<8 ; j++ )
sendgsm( atcmgd[j] ) ;
if( del_index[i]<=9 )
{
a = del_index[i] + 0x30 ;
sendgsm( a ) ;
sendgsm( 0x0d ) ; sendgsm( 0x0a ) ;
del_index[i] = 0 ;
}
else
{
a = del_index[i]/10 ;
b = del_index[i] - 10 * a + 0x30 ;
a = a + 0x30 ;
sendgsm( a ) ;
sendgsm( b ) ;
sendgsm( 0x0d ) ; sendgsm( 0x0a ) ;
del_index[i] = 0 ;
}
while( 1 )
{
timer_0 = 300 ;
gsmp = 0;
while( timer_0 )
{
a = readgsm( &b ) ;
if( a )
{
gsmproc[gsmp] = b ;
// sendtest( b ) ;
if( gsmp < (GSMP-1) )
gsmp++ ;
if( b == 0x0a )
break ;
}
}
if( !timer_0 )
{
gsmerr++ ;
return ;
}
else if( ( gsmproc[0] == 'O' ) && ( gsmproc[1] == 'K' ) )
{
gsmerr = 0 ;
break ;
}
else if( ( gsmproc[0] == 'E' ) && ( gsmproc[1] == 'R' ) && ( gsmproc[2] == 'R' ) && ( gsmproc[3] == 'O' ) && ( gsmproc[4] == 'R' ) )
{
gsmerr = 0 ;
return ;
}
else if( ( gsmproc[0] == 'R' ) && ( gsmproc[1] == 'I' ) && ( gsmproc[2] == 'N' ) && ( gsmproc[3] == 'G' ) )
ProcessRing( ) ;
else if( ( gsmproc[0] == 'N' ) && ( gsmproc[1] == 'O' ) && ( gsmproc[2] == ' ' ) && ( gsmproc[3] == 'C' ) )
ProcessNoC( ) ;
}
}
}
del_mark = 0 ;
}
void ReadMessage( void )
{
uchar a,b ;
uchar xdata PDU[400] ;
uchar xdata pdutemp[400],pdutemp1[400] ;
uchar index,gstate ;
uint data ls,i,j,len,len1,len2 ;
Setgsm( "AT+CMGF=0" ) ;
stringsendgsm( atcmgl ) ;
while(1)
{
timer_0 = 200 ;
gsmp = 0;
while( timer_0 )
{
a = readgsm( &b ) ;
if( a )
{
gsmproc[gsmp] = b ;
// sendtest( b ) ;
if( gsmp < (GSMP-1) )
gsmp++ ;
if( b == 0x0a )
break ;
}
}
if( !timer_0 )
{
gsmerr++ ;
return ;
}
else if( ( gsmproc[0] == 'O' ) && ( gsmproc[1] == 'K' ) )
{
gsmerr=0 ;
return ;
}
else if( ( gsmproc[0] == 'E' ) && ( gsmproc[1] == 'R' ) )
{
gsmerr = 0 ;
return ;
}
else if( ( gsmproc[0] == '+' ) && ( gsmproc[1] == 'C' ) && ( gsmproc[2] == 'M' ) && ( gsmproc[3] == 'G' ) && ( gsmproc[4] == 'L' ) )
{
if( gsmproc[8] == ',' )
{
index = gsmproc[7] - 0x30 ;
gstate = gsmproc[9] ;
}
else
{
index = ( gsmproc[7] - 0x30 ) * 10 + gsmproc[8] - 0x30 ;
gstate = gsmproc[10] ;
}
for( i=0 ; i<30 ; i++ )
if( del_index[i] == 0 )
{
del_index[i] = index ;
del_mark = 1 ;
break ;
}
if( gstate == '0' )
{
i = 0 ;
timer_0 = 100 ;
while( 1 )
{
a = readgsm( &b ) ;
if( a )
{
PDU[i] = b ;
// sendtest(b);
i++ ;
if( b == 0x0a )
break ;
}
if( timer_0 == 0 )
break ;
}
if( timer_0 != 0 )
{
if(PDU[20]=='0')
len=0;
else
len=10;
if(PDU[21]>'9')
len1=PDU[21]-'A'+10;
else
len1=PDU[21]-'0';
len1=len1+len;
len2=len1;
if(PDU[22]=='9')
{
len = 26 ;
len1-=2;
}
else
len = 24 ;
if( len1 == 11 )
{
for( i=0;i<len1;i+=2 )
{
Mold[messph].Source[i] = PDU[len+i+1] ;
Mold[messph].Source[i+1] = PDU[len+i] ;
}
Mold[messph].Source[len1] = 0 ;
}
else
{
for( i=0;i<len1+2;i+=2 )
{
Mold[messph].Source[i] = PDU[len+i+1-2] ;
Mold[messph].Source[i+1] = PDU[len+i-2] ;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -