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

📄 acomm.c

📁 一个使用稳定的串口通信例程。文件格式为51 格式
💻 C
📖 第 1 页 / 共 4 页
字号:
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 + -