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

📄 acomm.c

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

void I_clock(uchar tem)
{
		//watchdog( );
		SI=(bit)(tem&0x80);
		SCL=1;
		sample=SO;
		SCL=0;
}

uchar ReadStatus()
{
		uchar i_data=0x05;
		uchar i;
		uchar tem;
		P10Enable=0;
		CS=0;
		for(i=0;i<8;i++)
		{
			 I_clock(i_data );
			 i_data=i_data<<1;
		}
		o2=0;
		for(i=0;i<8;i++)
		{
			 o2=o2<<1;I_clock(0xff);
			 o2=(uchar)(sample)|o2;
		}
		CS=1;
		tem=o2;
		return(o2);
		P10Enable=1;
}

void EnableWrite( )
{
	uchar i_data=0x06;
	uchar i;
	uchar tem;

	while((ReadStatus( )&0x01)==0x01);
	CS=0;
	for(i=0;i<8;i++)
	{
		I_clock(i_data );
		i_data=i_data<<1;
	}
	CS=1;
}

void DisableWrite( )
{
		uchar i_data=0x04;
		uchar i;
		uchar tem;
		while((ReadStatus( )&0x01)==0x01);
		CS=0;
		for(i=0;i<8;i++)
		{
			 I_clock(i_data );
			 i_data=i_data<<1;
		}
		CS=1;
}

void WriteStatus(uchar set )
{
		uchar i_data=0x01;
		uchar i;
		P10Enable=0;
		while(ReadStatus( )&0x01==0x01);
		EnableWrite( );
		CS=0;
		for(i=0;i<8;i++)
		{
			 I_clock(i_data );
			 i_data=i_data<<1;
		}
		for(i=0;i<8;i++)
		{
			 I_clock(set);
			 set=set<<1;
		}

		CS=1;
		DisableWrite( );
		P10Enable=1;

}

void ReadData(uint addr,uint lenth,uchar * arrd)
{
	uchar i_data=0x03;
	uchar i; uint j;
	uchar * p;
	while(ReadStatus( )&0x01==0x01);
	p=(uchar *)(& addr);        /*p[0] is high byte of addr*/
	if(p[0]&0x01==0x01)        /* just if the high half sector,bit3=1 */
		i_data=i_data|0x08;
	CS=0;
	for(i=0;i<8;i++)
	{
		I_clock(i_data );
		i_data=i_data<<1;

	}
	i_data=p[1];
	for(i=0;i<8;i++)
	{
		I_clock(i_data );
		i_data=i_data<<1;
	}

	for(j=0;j<lenth;j++)
	{
		o2=0;
		for(i=0;i<8;i++)
		{
			o2=o2<<1;
			I_clock(0xff);
			o2=(uchar)(sample)|o2;
		}
		arrd[j]=o2;
		//sendtest(o2);
	}
	CS=1;
}

void WritePageData(uint addr,uchar * arr )
{
	uchar i_data=0x02;
	uchar i; uchar j;

	uchar tem;
	uchar * p;

	p=(uchar *)(& addr);        /*p[0] is high byte of addr*/
	if(p[0]&0x01==0x01)        /* just if the high half sector,bit3=1 */
		i_data=i_data|0x08;
	if(p[1]&0x0f!=0){rtxd("not a page address,try again");return;}
	while(ReadStatus( )&0x01==0x01);
	EnableWrite( );

	CS=0;
	for(i=0;i<8;i++)
	{
		I_clock(i_data );
		i_data=i_data<<1;
	}
	i_data=p[1];
	for(i=0;i<8;i++)
	{
		I_clock(i_data );
		i_data=i_data<<1;
	}
	for(j=0;j<16;j++)
	{
		tem=arr[j];
		for(i=0;i<8;i++)
		{
			I_clock(tem);
			tem=tem<<1;
		}
	//arr[j]=o2;
	}
	CS=1;
	DisableWrite( );
}

void Set_view(uchar num,uchar * source)
{
	uint addr;
	CS=1;
	P10Enable=0;
	addr=strlen(source);
	source[addr]=0;
	addr=(uint)(((uint)num-0x40)<<4);
	WritePageData(addr,source);
	P10Enable=1;
}

uchar Get_view(uchar num,uchar * target)
{
	uint addr;
	CS=1;
	P10Enable=0;
	addr=(uint)(((uint)num-0x40)<<4);
	ReadData(addr,16,target);
	P10Enable=1;
}

void Rcv_answer( )
{
	uchar a,b,c,coma[20],smsc[20],dest[20],sms[180],send[200] ;
	uint i,j ;

	while( 1 )
	{
		while( 1 )
		{
			a = readtest( &b ) ;
			if( a )
			{
				testproc[testp] = b ;
				if( testp < (TSTP-1) )
					testp++ ;
				if( b == 0x0a )
					break ;
			}
			else
				return ;
		}
		testp=0;
	}
}

void ProcessDTMF( )
{
	uchar a,b,c,coma[20],smsc[20],dest[20],sms[180],send[200] ;
	uint i,j ;

	while( 1 )
	{
		while( 1 )
		{
			a = readgps( &b ) ;
			if( a )
			{
				gpsproc[gpsp] = b ;
				if( gpsp < (GPSP-1) )
					gpsp++ ;
				if( b == '#' )
					break ;
			}
			else
				return ;
		}
		gpsproc[gpsp] = 0 ;
		rtxd( gpsproc ) ;
		if( ( gpsproc[0] == '0' )&&( gpsproc[1] == '4' )&&( autohand == 1 ) )
		{	stop_car = 1 ;
			SendDTMF( "22" ) ;
		}
		else if( ( gpsproc[0] == '0' )&&( gpsproc[1] == '5' )&&( autohand == 1 ) )
		{	lock_door = 1 ;
			SendDTMF( "22" ) ;
		}
		else if( ( gpsproc[0] == '0' )&&( gpsproc[1] == '8' )&&( autohand == 1 ) )
		{	stop_car = 0 ;
			SendDTMF( "22" ) ;
		}
		else if( ( gpsproc[0] == '0' )&&( gpsproc[1] == '9' )&&( autohand == 1 ) )
		{	lock_door = 0 ;
			SendDTMF( "22" ) ;
		}
		gpsp=0;
	}
}

void Processtelephone( )
{
	uchar xdata temp_set[400];
	uchar i,a,b ;
	uchar a1,b1 ;
	uint n,c ;
	uchar line1 ;

	if( hasphone == 0 )
		return ;
	strcpy( temp_set,"ATDT" ) ;
	strcat( temp_set,telephone ) ;
	strcat( temp_set,";" ) ;
	stringsendgsm( temp_set ) ;
	out_call = 1 ;
	while(1)
	{	timer_0 = 2000 ;
		gsmp = 0;
		while( timer_0 )
		{       a = readgsm( &b ) ;
			if( a )
			{
				gsmproc[gsmp] = b ;
				sendtest(b );
				if( gsmp < (GSMP-1) )
					gsmp++ ;
				if( b == 0x0a )
					break ;
			}
			while( 1 )
			{
				a1 = readtel(&b1) ;
				if( a1 )
				{
					telproc[telpp] = b1 ;
					sendtest( b1 ) ;
					if( telpp < (TELP-1) )
						telpp++ ;
					if( b1 == 0x0a )
					{
						line1 = 1 ;
						break ;
					}
				}
				else
				{
					line1 = 0 ;
					break ;
				}
			}
			if(line1==1)
			{
				if( ( telproc[0] == 'T' ) && ( telproc[1] == 'T' ) && ( telproc[2] == 'L') && ( telproc[3] == '8'))
				{
					if( at_talk == 1 )
						stringsendgsm( "AT+CHUP" ) ;
					else
						stringsendgsm( "AT+CHLD=0" ) ;
					at_talk = 0 ;
					while(1)
					{
						timer_0 = 100 ;
						gsmp = 0;
						while( timer_0 )
						{
							a = readgsm( &b ) ;
							if( a )
							{
								gsmproc[gsmp] = b ;
								if( gsmp < (GSMP-1) )
									gsmp++ ;
								if( b == 0x0a )
									break ;
							}
						}
						if( !timer_0 )
							break ;
						else if( ( gsmproc[0] == 'O' ) && ( gsmproc[1] == 'K' ) )
							break ;
						else if( ( gsmproc[0] == 'E' ) && ( gsmproc[1] == 'R' ) )
							break ;
						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( ) ;
					}
				}
				line1=0 ;
				telpp=0 ;
				l_tail = l_head ;
			}
		}
		if( !timer_0 )
		{
			out_call = 0 ;
			break ;
		}
		else if( ( gsmproc[0] == 'O' ) && ( gsmproc[1] == 'K' ) )
		{
			out_call = 0 ;
			at_talk = 1 ;
			if( needsms == 1 )
			{	count = 20 ;
				send_time = send_etime ;
				timer_2 = 0 ;
			}
			break ;
		}
		else if( ( gsmproc[0] == 'E' ) && ( gsmproc[1] == 'R' ) )
		{
			out_call = 0 ;
			break ;
		}
		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( ) ;
			break ;
		}
	}
	hasphone = 0 ;
}

void Rcv_Telecom(void)
{
	uchar a,b ;
	uint len ,len1, len2,i ,j;
	uchar xdata dialno[50],dialat[50],seth[10],setno[50],ch ;
	while( 1 )
	{
		while( 1 )
		{
			a = readtel(&b) ;
			if( a )
			{
				telproc[telpp] = b ;
                                sendtest( b ) ;
				if( telpp < (TELP-1) )
					telpp++ ;
				if( b == 0x0a )
					break ;
			}
			else
				return ;
		}
		if( ( telproc[0] == 'T' ) && ( telproc[1] == 'T' ) && ( telproc[2] == 'L') && ( telproc[3] == '5'))
		{
			if( in_call == 1 )
			{
				stringsendgsm( "ATA" ) ;
				while(1)
				{   timer_0 = 100 ;
					gsmp = 0;
					while( timer_0 )
					{       a = readgsm( &b ) ;
						if( a )
						{       gsmproc[gsmp] = b ;
							if( gsmp < (GSMP-1) )
								gsmp++ ;
							if( b == 0x0a )
								break ;
						}
					}
					if( !timer_0 )
						break ;
					else if( ( gsmproc[0] == 'O' ) && ( gsmproc[1] == 'K' ) )
					{
                                        	at_talk = 1 ;
						break ;
					}
					else if( ( gsmproc[0] == 'E' ) && ( gsmproc[1] == 'R' ) )
						break ;
					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( ) ;
				}
				in_call = 0 ;
			}
		}
		else if( ( telproc[0] == 'T' ) && ( telproc[1] == 'T' ) && ( telproc[2] == 'L') && ( telproc[3] == '3') )
		{
			Get_view( telproc[4]+0x17,dialno ) ;
                        strcpy( dialat,"TTL6" ) ;
                        strcat( dialat,dialno ) ;
                        sendtelstr( dialat ) ;
		}
		else if( ( telproc[0] == 'T' ) && ( telproc[1] == 'T' ) && ( telproc[2] == 'L') && ( telproc[3] == '8') )
		{
			if( at_talk == 1 )
				stringsendgsm( "AT+CHUP" ) ;
			else
				stringsendgsm( "AT+CHLD=0" ) ;
			at_talk = 0 ;
			listen_alm = 0 ;
			while(1)
			{
				timer_0 = 100 ;
				gsmp = 0;
				while( timer_0 )
				{
					a = readgsm( &b ) ;
					if( a )
					{
						gsmproc[gsmp] = b ;
						if( gsmp < (GSMP-1) )
							gsmp++ ;
						if( b == 0x0a )
							break ;
					}
				}
				if( !timer_0 )
					break ;
				else if( ( gsmproc[0] == 'O' ) && ( gsmproc[1] == 'K' ) )
					break ;
				else if( ( gsmproc[0] == 'E' ) && ( gsmproc[1] == 'R' ) )
					break ;
				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( ) ;
			}
		}
		else if( ( telproc[0] == 'T' ) && ( telproc[1] == 'T' ) && ( telproc[2] == 'L') && ( telproc[3] == '9') )
		{
			if( in_call == 1 )
			{
				stringsendgsm( "ATA" ) ;
				while(1)
				{   timer_0 = 100 ;
					gsmp = 0;
					while( timer_0 )
					{       a = readgsm( &b ) ;
						if( a )
						{       gsmproc[gsmp] = b ;
							if( gsmp < (GSMP-1) )
								gsmp++ ;
							if( b == 0x0a )
								break ;
						}
					}
					if( !timer_0 )
						break ;
					else if( ( gsmproc[0] == 'O' ) && ( gsmproc[1] == 'K' ) )
					{	at_talk = 1 ;
						break ;
					}
					else if( ( gsmproc[0] == 'E' ) && ( gsmproc[1] == 'R' ) )
						break ;
					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( ) ;
				}
				in_call = 0 ;
			}
			else if( at_talk == 0 )
			{
				for ( i = 0 ; i < telpp-6 ; i++ )
					dialno[ i ] = telproc[ i + 4 ] ;
				dialno[i] = 0 ;
				strcpy( telephone,dialno ) ;
                                rtxd( telephone ) ;
				if( telephone[0] == '*' )
				{
					hasphone = 0 ;
					if( ( telephone[1] >='0' )&&( telephone[1] <='9' )&&( telephone[2] >='0' )&&( telephone[2] <='9' ) )
					{
						substr( dialno,seth,1,2 ) ;
						ch = atoi( seth ) + 'F' ;
						substr( dialno,setno,4,strlen( dialno ) -4 ) ;
						Set_view( ch,setno ) ;
						sendtelstr( "TTL1" ) ;
					}
					else if ( telephone[1] == '*' )
					{
						SetState[2] = '1' ;
						Set_view( 'Z',SetState ) ;
						sendtelstr( "TTL1" ) ;
					}
				}
				else if( telephone[0] == '#' )
				{
					hasphone = 0 ;
					if( ( telephone[1] >='0' )&&( telephone[1] <='9' )&&( telephone[2] >='0' )&&( telephone[2] <='9' ) )
					{
						substr( dialno,seth,1,2 ) ;
						ch = atoi( seth ) + 'F' ;
						Get_view( ch,setno ) ;
						strcpy( dialno,"TTL6" ) ;
						strcat( dialno,setno ) ;
						sendtelstr( dialno ) ;
					}
					else if ( telephone[1] == '#' )
					{
						SetState[2] = '0' ;
						Set_view( 'Z',SetState ) ;
						sendtelstr( "TTL1" ) ;
					}
				}
				else
					hasphone = 1 ;
			}
		}
		else
		{
			if( at_talk == 1 )
			{
				strcpy( dialno,"AT+VTS=\"" ) ;
				dialno[8] = telproc[0] ;
				dialno[9] = 0 ;
				strcat( dialno,"\",1" ) ;
				stringsendgsm( dialno ) ;
				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 )
						break ;
					else if( ( gsmproc[0] == 'O' ) && ( gsmproc[1] == 'K' ) )
						break ;
					else if( ( gsmproc[0] == 'E' ) && ( gsmproc[1] == 'R' ) )
						break ;
					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( ) ;
				}
			}
		}
		telpp=0 ;
	}
}

void SendDTMF( uchar *s )
{
	uint i,len ;
	uchar dialno[50],a,b ;
	len = strlen( s ) ;
	if( len > 29 )
		return ;
	Setgsm( "AT+VTD=1" ) ;
//	for( i=0;i<len;i++ )
	{
		strcpy( dialno,"AT+VTS=\"" ) ;
		strcat( dialno,s ) ;
		strcat( dialno,"\"" ) ;
		stringsendgsm( dialno ) ;
		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 )
				break ;
			else if( ( gsmproc[0] == 'O' ) && ( gsmproc[1] == 'K' ) )
				break ;
			else if( ( gsmproc[0] == 'E' ) && ( gsmproc[1] == 'R' ) )
				break ;
			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 ProcessCommand( void )
{
	if( ( stop_car == 1 )||( stop_carm == 1 )||( stop_carp == 1 ) )
	{
		P16 = 0 ;
	}
	else
		P16 = 1 ;
	if( ( lock_door == 1 )||( lock_doorm == 1 )||( lock_doorp == 1 ) )
	{
		P17 = 0 ;
	}
	else
		P17 = 1 ;
}

⌨️ 快捷键说明

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