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

📄 acomm.c

📁 一个使用稳定的串口通信例程。文件格式为51 格式
💻 C
📖 第 1 页 / 共 4 页
字号:
						}
						Mold[messph].Source[len1+2] = 0 ;
					}

//					rtxd( Mold[messph].Source ) ;

					if(len2/2*2==len2)
						len=28+len2;
					else
						len=29+len2;
					Mold[messph].year = ( ( ( PDU[len+1] & 0x0f )*10 ) + ( PDU[len] & 0x0f ) ) ;
					Mold[messph].month = ( ( ( PDU[len+3] & 0x0f )*10 ) + ( PDU[len+2] & 0x0f ) ) ;
					Mold[messph].date = ( ( ( PDU[len+5] & 0x0f )*10 ) + ( PDU[len+4] & 0x0f ) ) ;
					Mold[messph].hour = ( ( ( PDU[len+7] & 0x0f )*10 ) + ( PDU[len+6] & 0x0f ) ) ;
					Mold[messph].minute = ( ( ( PDU[len+9] & 0x0f )*10 ) + ( PDU[len+8] & 0x0f ) ) ;
					Mold[messph].second = ( ( ( PDU[len+11] & 0x0f )*10 ) + ( PDU[len+10] & 0x0f ) ) ;
					Mold[messph].year = ( ( PDU[43] & 0x0f ) << 4 ) | ( PDU[42] & 0x0f ) ;
					Mold[messph].month = ( ( PDU[45] & 0x0f ) << 4 ) | ( PDU[44] & 0x0f ) ;
					Mold[messph].date = ( ( PDU[47] & 0x0f ) << 4 ) | ( PDU[46] & 0x0f ) ;
					Mold[messph].hour = ( ( PDU[49] & 0x0f ) << 4 ) | ( PDU[48] & 0x0f ) ;
					Mold[messph].minute = ( ( PDU[51] & 0x0f ) << 4 ) | ( PDU[50] & 0x0f ) ;
					Mold[messph].second = ( ( PDU[53] & 0x0f ) << 4 ) | ( PDU[52] & 0x0f ) ;
					for(i=0;i<10;i++)
						t[i]=PDU[len+i] ;
					/*t[10] = PDU[52] ;
					t[11] = PDU[53] ;*/
					i = 0 ;
					while( 1 )
					{
						PDU[i] = PDU[len+14+i] ;
						if( PDU[i] == 0x0d )
							break ;
						i++ ;
					}
					PDU[i] = 0 ;
					PDU2Text( PDU,pdutemp1 ) ;
					ls=strlen(pdutemp1);
					j=0;
					for(i=0;i<ls;i++)
					{
						if(pdutemp1[i]<0x20)
						{
							pdutemp[j]=((pdutemp1[i])&0x0f)|(pdutemp1[i+1]<<4);
							j++;
							i++;
						}
						else
						{	pdutemp[j]=pdutemp1[i];
							j++;
						}
					}
					pdutemp[j]=0;

//					rtxd( pdutemp ) ;

					strcpy( Mold[messph].context,pdutemp ) ;
					messph++ ;
					if( messph == MESSLEN )
						messph = 0 ;
					if( messpt == messph )
						messpt++ ;
					if( messpt == MESSLEN )
						messpt = 0 ;
					stop_state = WAKEUP ;
				}
			}
		}
		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( ) ;
	}
}

void substr( char *s,char *d,uint start,uint n )
{
	uint i ;
	for(i=0;i<n;i++)
		d[i]=s[i+start] ;
	d[n]=0 ;
}

void Setcsca( void )
{
	char i,a,b,j,zwtemp[50] ;
        uint a1 ;
	strcpy( zwtemp,"AT+CSCA=" ) ;
	zwtemp[8] = '"' ;
	if( smsc_code[0] == '+' )
		zwtemp[9] = 0 ;
	else
	{
		zwtemp[9] = '+' ;
		zwtemp[10] = 0 ;
	}
	strcat( zwtemp,smsc_code ) ;
	a1=strlen( zwtemp ) ;
	zwtemp[a1++]='"' ;
	zwtemp[a1]=0;
	stringsendgsm(zwtemp);
	while( 1 )
	{
		timer_0 = 100 ;
		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] == '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( ) ;
	}
}

void Setgsm( uchar *s )
{
	char i,a,b,j ;
	stringsendgsm(s);
	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++ ;
			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] == '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( ) ;
	}
}

void AddMout( uchar *v,uchar *m )
{
	strcpy( Mout[moutph].target,v ) ;
	strcpy( Mout[moutph].context,m ) ;
	moutph++ ;
	if( moutph == MOUTLEN )
		moutph = 0 ;
	if( moutpt == moutph )
		moutpt++ ;
	if( moutpt == MOUTLEN )
		moutpt = 0 ;
}

void ProcessMessage( )
{
	uint  i,j,len,len2,m,n ;
	uchar control_num ;
	uchar control_snow[20] ;   /* 当前的控制序号 */
	uchar xdata Ptemp[150],Ptemp1[150],display[180] ;
	uchar xdata temp_set[400];
	uchar xdata disp[160] ;
	uchar b,c ;
	while( messpt != messph )
	{
		len = strlen(Mold[messpt].context) ;
		if( (Mold[messpt].context[0]=='0')&&(Mold[messpt].context[1]=='0') )
		{
			substr( Mold[messpt].context,Mold[messpt].context,10,len-10) ;
			len -= 10 ;
		}
		if( ( Mold[messpt].context[0] == 'A' ) && ( Mold[messpt].context[1] == 'A' ) )
			AddMout( Mold[messpt].Source,"Answer!" ) ;
		i = strcmp( Mold[messpt].Source,control_code ) ;
		j = strcmp( Mold[messpt].Source,control_code_bak1 ) ;
		m = strcmp( Mold[messpt].Source,control_code_bak2 ) ;
		rtxd( control_code ) ;
		rtxd( control_code_bak1 ) ;
		rtxd( control_code_bak2 ) ;
		rtxd( Mold[messpt].Source ) ;
		if( ( i==0 )||( j==0 )||( m==0 ) )
		{
			if ( ( Mold[messpt].context[0] == 'R' ) && ( Mold[messpt].context[1] == 'A' ) )
			{
				SetState[0] = Mold[messpt].context[14] ;
				Set_view( 'Z',SetState ) ;
			}
			if ( ( Mold[messpt].context[0] == 'R' ) && ( Mold[messpt].context[1] == 'G' ) )
			{
				SetState[1] = Mold[messpt].context[14] ;
				Set_view( 'Z',SetState ) ;
			}
			if ( ( Mold[messpt].context[0] == 'R' ) && ( Mold[messpt].context[1] == 'R' ) )
			{
				SetState[2] = Mold[messpt].context[14] ;
				Set_view( 'Z',SetState ) ;
			}
			if ( ( Mold[messpt].context[0] == 'R' ) && ( Mold[messpt].context[1] == 'C' ) )
			{
				SetState[5] = Mold[messpt].context[14] ;
				Set_view( 'Z',SetState ) ;
			}
			if( ( Mold[messpt].context[0] == 'T' ) && ( Mold[messpt].context[1] == 'H' ) )
			{
				control_num = Mold[messpt].context[14] ;
				len = strlen( Mold[messpt].context ) ;
				substr( Mold[messpt].context,Ptemp1,15,len-15 ) ;
				if( ( control_num != 'Y' )&&( control_num != 'X' )&&( control_num != 'Z' ) )
					Set_view( control_num,Ptemp1 ) ;
				if( control_num == 'A' )
					strcpy( view_code,Ptemp1 ) ;
				if( control_num == 'B' )
					strcpy( control_code,Ptemp1 ) ;
				if( control_num == 'C' )
					strcpy( control_code_bak1,Ptemp1 ) ;
				if( control_num == 'D' )
					strcpy( control_code_bak2,Ptemp1 ) ;
				if( control_num == 'E' )
					strcpy( smsc_code,Ptemp1 ) ;
				if( control_num == 'F' )
					strcpy( listen_code,Ptemp1 ) ;
				if( control_num == 'Q' )
					strcpy( listen_code1,Ptemp1 ) ;
			}
			if( ( Mold[messpt].context[0] == 'T' ) && ( Mold[messpt].context[1] == 'P' ) )
			{
				len = strlen( Mold[messpt].context ) ;
				substr( Mold[messpt].context,PERIOD_STR,14,len-14 ) ;
				Set_view( 'W',PERIOD_STR ) ;
				PERIOD = atol( PERIOD_STR )*100 ;
				if( PERIOD == 0 )
					PERIOD = 360000 ;
			}
			if( ( Mold[messpt].context[0] == 'T' ) && ( Mold[messpt].context[1] == 'T' ) )
			{
				len = strlen( Mold[messpt].context ) ;
                                trace_type = Mold[messpt].context[14] ;
				if( len ==21 )
					count = ( Mold[messpt].context[18] - 0x30 ) * 100 + ( Mold[messpt].context[19] - 0x30 ) * 10 + Mold[messpt].context[20] - 0x30 ;
				else
					count=20;
				send_time = ( Mold[messpt].context[15] - 0x30 ) * 100 + ( Mold[messpt].context[16] - 0x30 ) * 10 + Mold[messpt].context[17] - 0x30 ;
				if( send_time < 10 )
					send_time = 10 ;
				send_time = send_time * 100 ;
				sendstate = CENTREWANT ;
				timer_2 = 0;
			}
		}
		messpt++ ;
		if( messpt == MESSLEN )
			messpt = 0 ;
	}
}

void SendUntimed( void )
{
	uchar gsm_send ;
	uint i ;
	if( moutpt != moutph )
	{
		gsm_send = ProcessSend( Mout[moutpt].target,Mout[moutpt].context ) ;
		sendnum++ ;
		if( ( gsm_send == 1 )||( sendnum >= 6 ) )
		{
			sendnum=0 ;
			moutpt++ ;
			if( moutpt == MOUTLEN )
				moutpt = 0 ;
		}
	}
}
/*
uchar ProcessSend( uchar * target,uchar *senddata )
{
	uchar xdata temp1[400] ;
	uchar xdata PDU[400] ;
	uchar b,a ;
	uint i,ls ;
	if( regist_state == '0' )
		return 0 ;
	if( IN2 == 0 )
	{
		rtxd( target ) ;
		rtxd( senddata ) ;
	}
	ls = strlen( target ) ;
	if( ls == 6 )
	{
		strcpy(PDU,Pdu_head1);
		PDU[26] = target[1] ;
		PDU[27] = target[0] ;
		PDU[28] = target[3] ;
		PDU[29] = target[2] ;
		PDU[30] = target[5] ;
		PDU[31] = target[4] ;
	}
	else
	{
		strcpy(PDU,Pdu_head2);
		PDU[26] = target[1] ;
		PDU[27] = target[0] ;
		PDU[28] = target[3] ;
		PDU[29] = target[2] ;
		PDU[30] = target[5] ;
		PDU[31] = target[4] ;
		PDU[32] = target[7] ;
		PDU[33] = target[6] ;
		PDU[34] = target[9] ;
		PDU[35] = target[8] ;
		PDU[36] = 'F' ;
		PDU[37] = target[10] ;
	}
	PDU[4] = smsc_code[1] ;
	PDU[5] = smsc_code[0] ;
	PDU[6] = smsc_code[3] ;
	PDU[7] = smsc_code[2] ;
	PDU[8] = smsc_code[5] ;
	PDU[9] = smsc_code[4] ;
	PDU[10] = smsc_code[7] ;
	PDU[11] = smsc_code[6] ;
	PDU[12] = smsc_code[9] ;
	PDU[13] = smsc_code[8] ;
	PDU[14] = smsc_code[11] ;
	PDU[15] = smsc_code[10] ;
	PDU[16] = 'F' ;
	PDU[17] = smsc_code[12] ;
	Text2PDU( senddata,temp1 ) ;
	strcat( PDU,temp1 ) ;
	stringsendgsm( atcmgs ) ;
	timer_0 = 200 ;
	while( 1 )
	{
		a = readgsm( &b ) ;
		if( a == 1 )
		{
			if( IN2 == 0 )
				sendtest(b);
			if( b == '>' )
				break ;
		}
		if ( timer_0 == 0 )
			break ;
	}
	if( timer_0 != 0 )
	{
		ls = strlen( PDU ) ;
		PDU[ls++] = 0x1a ;
		PDU[ls] = 0 ;
		for( i=0;i<ls;i++ )
			sendgsm( PDU[i] ) ;
		while( 1 )
		{
			timer_0 = 1000 ;
			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++ ;
				return 0 ;
			}
			else if( ( gsmproc[0] == 'O' ) && ( gsmproc[1] == 'K' ) )
			{
				gsmerr=0 ;
				return 1 ;
			}
			else if( ( gsmproc[0] == 'E' ) && ( gsmproc[1] == 'R' ) && ( gsmproc[2] == 'R' ) && ( gsmproc[3] == 'O' ) && ( gsmproc[4] == 'R' ) )
			{
				return 0 ;
			}
			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( ) ;
		}
	}
}
*/
uchar ProcessSend( uchar * target,uchar *senddata )
{
	uchar b,a,zwtemp[50] ;
	uint i,ls ;
//	if( regist_state == '0' )
//		return 0 ;
	rtxd( target ) ;
	rtxd( senddata ) ;
	Setcsca( ) ;
	Setgsm( "AT+CMGF=1" ) ;
	Setgsm( "AT+CSMP=17,11,0,0" ) ;
//	Setgsm( "AT+CSMP=17,11,0,8" ) ;      //Unicode
//	Setgsm( "AT+CSMP=17,11,0,246" ) ;

	strcpy( zwtemp,atcmgs ) ;
	strcat( zwtemp,target ) ;
	stringsendgsm( zwtemp ) ;
	timer_0 = 200 ;
	while( 1 )
	{
		a = readgsm( &b ) ;
		if( a == 1 )
		{
			sendtest(b);
			if( b == '>' )
				break ;
		}
		if ( timer_0 == 0 )
			break ;
	}
	if( timer_0 != 0 )
	{
		ls = strlen( senddata ) ;
		senddata[ls++] = 0x1a ;
		senddata[ls] = 0 ;
		for( i=0;i<ls;i++ )
			sendgsm( senddata[i] ) ;
		while( 1 )
		{
			timer_0 = 1000 ;
			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 0 ;
			}
			else if( ( gsmproc[0] == 'O' ) && ( gsmproc[1] == 'K' ) )
			{
				gsmerr = 0 ;
				return 1 ;
			}
			else if( ( gsmproc[0] == 'E' ) && ( gsmproc[1] == 'R' ) && ( gsmproc[2] == 'R' ) && ( gsmproc[3] == 'O' ) && ( gsmproc[4] == 'R' ) )
			{
				return 0 ;
			}
			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( ) ;
		}
	}
}

void ProcessAlert( void )
{

/* 如果hand_alerm = HANDTIME,紧急报警 */
	if( ( hand_alerm >= HANDTIME ) && ( hand_alm == 0 ) )
	{
		send_time = send_etime ;
		sendstate = HALERT ;
		hand_alm = 1 ;
		count = 50 ;
		timer_2 = 0 ;
//		hsent = 0 ;
		stop_state = WAKEUP ;
		AddMout( view_code,"SOS!!!" ) ;
	}

/* 如果alermed=100,报警器被触发,door_state=100,在点火 */
	if( ( alermed == 100 )&&( fire_state == 100 )&&( !alm2 ) )
	{
		send_time = send_etime ;
		sendstate = FIREALERT ;
		alm2 = 1 ;
		timer_2 = 0 ;
		count = 10 ;
		stop_state = WAKEUP ;
		AddMout( view_code,"InValid Fired" ) ;
	}
	else if( alermed == 0 )
		alm2 = 0 ;

/* 如果alermed=100,报警器被触发,door_state=100,门被打开 */
	if( ( alermed == 100 )&&( door_state == 100 )&&( !alm3 ) )
	{
		send_time = send_etime ;
		sendstate = DOORALERT ;
		alm3 = 1 ;
		timer_2 = 0 ;
		count = 10 ;
		stop_state = WAKEUP ;
		AddMout( view_code,"InValid Open Door" ) ;
	}
	else if( alermed == 0 )
		alm3 = 0 ;

/* 如果alermed=100,报警器被触发,换醒终端 */
	if( ( alermed == 100 )&&( !alm7 ) )
	{
		stop_state = WAKEUP ;
		stop_carm = 1 ;
		lock_doorm = 1 ;
                alm7 = 1 ;
		if( ( !alm3 )&&( !alm2 ) )
			AddMout( view_code,"Car Shock" ) ;
	}
	else if( alermed == 0 )
	{
		stop_carm = 0 ;
		lock_doorm = 0 ;
                alm7 = 0 ;
	}

/* 如果remove_state=100,防拆开关触发 */
	if( ( remove_state == 100 )&&( !alm4 ) )
	{
		send_time = send_etime ;
		sendstate = REMOVEALERT ;
		alm4 = 1 ;
		timer_2 = 0 ;
		count = 10 ;
		stop_state = WAKEUP ;
	}
	else if( remove_state == 0 )
		alm4 = 0 ;

/* 如果v12_state=100,电源故障 */
	if( ( v12_state == 100 )&&( !alm5 ) )
	{
		send_time = send_etime ;
		sendstate = POWERALERT ;
		alm5 = 1 ;
		timer_2 = 0 ;
		count = 10 ;
		stop_state = WAKEUP ;
	}
	else if( v12_state == 0 )
		alm5 = 0 ;

/* 如果wire_state=100,紧急按钮故障 */
	if( ( wire_state == 100 )&&( !alm6 ) )
	{
		send_time = send_etime ;
		sendstate = WIREALERT ;
		alm6 = 1 ;
		timer_2 = 0 ;
		count = 10 ;
		stop_state = WAKEUP ;
		AddMout( view_code,"SOS ERR" ) ;
	}
	else if( wire_state == 0 )
		alm6 = 0 ;
	alm = alm1 | alm2 | alm3 | alm4 | alm5 | alm6 ;
}

void ProcessListen( )
{
	uchar xdata temp_set[200],listen_phone[30] ;
	uchar i,a,b,len ;
	uint n,c ;

	if( at_talk || ( ( !hand_alm ) && ( !alm ) ) )
		return ;
	if( hand_alm )
		Get_view( 'F',listen_phone ) ;
	else
		Get_view( 'Q',listen_phone ) ;
	len = strlen( listen_phone ) ;
	strcpy( temp_set,"ATDT" ) ;
/*	if( len < 11 )
	{
		for( i=0;i<number_LAC;i++ )
			if( MY[i].LAC==Nowlacn )
				break ;
		if( i!= number_LAC )
			strcat( temp_set,MY[i].QH ) ;
		else
			strcat( temp_set,"020" ) ;
	}*/
	strcat( temp_set,listen_phone ) ;
	strcat( temp_set,";" ) ;
	stringsendgsm( temp_set ) ;
	out_call = 1 ;
	while(1)
	{
		timer_0 = 2500 ;
		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 )
		{
			out_call = 0 ;
			return ;
		}
		else if( ( gsmproc[0] == 'O' ) && ( gsmproc[1] == 'K' ) )
		{
			out_call = 0 ;
			autohand = 1 ;
			at_talk = 1 ;
			listen_alm = 1 ;
			hand_alm = 0 ;
			return ;
		}
		else if( ( gsmproc[0] == 'E' ) && ( gsmproc[1] == 'R' ) )
		{

⌨️ 快捷键说明

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