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

📄 gr47.c

📁 gr47的程序
💻 C
📖 第 1 页 / 共 2 页
字号:
			cmd[i]=cmd1[i];	
	}
	else
	{
		for(i=0;i<24;i++)
			cmd[i]=cmd0[i];	
	}	  	
	cmd[8] = '"';	
	cmd[11] = '"';
	cmd[13] = '"';
	cmd[16] = '"';
	cmd[18] = '"';
	cmd[21] = '"';    
 	get_string_clear1( );				//清空接收缓冲区  
	put_string1(cmd, 24);   				//串口接收回复,关		
	os_wait(K_TMO,10,0);
 	get_string_clear1( );				//清空接收缓冲区  
	
	gsm_busy = 0;
}				  

/****************************************************************************** 
// 读取电话本 
// 用CPBR
//一次读出一条电话号码
// pDrc 返回字符串指针
// index 电话号码序号
//返回:字符串长度  
UCHAR read_phonebook(UCHAR	xdata	*pDrc,UCHAR	index)
{  	
	UCHAR m,i;				  
	UCHAR r_len; 		 // 串口收到的数据长度  
	UCHAR code	cmd0[]={"AT+CPBR="}; // 命令串 
	UCHAR code	cmd1[]={"AT+CPBS=ME\r\n"}; // 命令串 
	UCHAR xdata	cmd[16]; 			// 命令串 
	UCHAR xdata	buf[128]; // 接受缓冲 	
	UCHAR xdata	*ptr;  	

   	while(gsm_busy)
		os_wait(K_TMO,1,0);	 
	gsm_busy = 1;

	for(i=0;i<12;i++)
		cmd[i]=cmd1[i];	

 	get_string1(buf);				//清空发送缓冲区和接收缓冲区
	put_string1(cmd, 12);
	
	os_wait(K_TMO,10,0);

	for(i=0;i<8;i++)
		cmd[i]=cmd0[i];	

 	get_string1(buf);				//清空发送缓冲区和接收缓冲区
	put_string1(cmd, 8);
		   	
	m = index/10;
	if(m != 0)
		put_char1(m +0x30);
	put_char1((index%10)+0x30);
	put_char1(0x0d);
	put_char1(0x0a);

	for(i = 2; i>0; i--)
	{
		r_len = get_string1(buf);	 // 读应答数据
		if(r_len >15)
			break;
	}
	if(r_len <15)	
	{	
		gsm_busy = 0;
		return(0);				
	}	  
	
	buf[127] = '\0';	
	if((ptr = strchr(buf,'"')) != NULL)
	{	
			ptr++;				
			r_len = 0; 
			m = *ptr;

			while(m != '"')
			{
				m = *ptr++;
				*pDrc++ = m;

			   	r_len++;
			}
			gsm_busy = 0;
			return(r_len-1);	 	
	}
	gsm_busy = 0;
	return (0);
}

/****************************************************************************** 
// 写电话本 
// 用CPBW
//一次写一条电话号码
//pSrc: 源字符串指针
//index 电话号码序号  	turn(TRUE); return(FALSE); 
//len 电话号码长度   
//返回:成功/失败  		AT+CPBW=4,13459553766,129,CENTER
bit write_phonebook(UCHAR	xdata	*pSrc,UCHAR	len,UCHAR	index)
{  	
	UCHAR m,i,j;				  
	UCHAR r_len; 		 // 串口收到的数据长度  
	UCHAR code	cmd0[]={"AT+CPBW="}; // 命令串 
	UCHAR code	cmd0_[]={",129,strong\r\n"}; // 命令串 
	UCHAR code	cmd1[]={"AT+CPBS=ME\r\n"}; // 命令串 
	UCHAR xdata	cmd[16]; 			// 命令串 
	UCHAR xdata	buf[128]; // 接受缓冲 	
	UCHAR xdata	*ptr;  	

   	while(gsm_busy)
		os_wait(K_TMO,1,0);	 
	gsm_busy = 1;

	for(i=0;i<12;i++)
		cmd[i]=cmd1[i];	

 	get_string1(buf);				//清空发送缓冲区和接收缓冲区
	put_string1(cmd, 12);
	
	os_wait(K_TMO,10,0);	 
					   
	for(i=0;i<8;i++)
		cmd[i]=cmd0[i];	

 	get_string1(buf);				//清空发送缓冲区和接收缓冲区
	put_string1(cmd, 8);
		   	
	m = index/10;
	if(m != 0)
		put_char1(m +0x30);
	put_char1((index%10)+0x30);
	put_char1(',');
		
	put_string1(pSrc, len);

	for(i=0;i<13;i++)
		cmd[i]=cmd0_[i];		
	put_string1(cmd, 13);
	
	os_wait(K_TMO,1,0);

	for(j = 2; j>0; j--)
	{	
		for(i = 2; i>0; i--)
		{
			r_len = get_string1(buf);	 // 读应答数据
			if(r_len > 0)
				break;
		}
		if(r_len == 0)	
		{	
			gsm_busy = 0;
			return(FALSE);				
		}	  
		
		buf[127] = '\0';	
		if((ptr = strstr(buf,"OK")) != NULL)
		{	   				
			gsm_busy = 0;
			return(TRUE);	 	
		} 	 	
	}

	gsm_busy = 0;
	return (FALSE);
}

/******************************************************************************/ 
bit  ReadTime(void)
{					  
	UINT  xdata	r_len; 		 // 收到的数据长度  
	UCHAR 	i;
	UCHAR code	cmd0[ ]={"AT+CCLK?\r\n"}; // 命令串 
	UCHAR xdata	cmd[11]; 			// 命令串 
	UCHAR xdata	buf[50]; // 接受缓冲 	
	UCHAR xdata	*ptr;
	UCHAR xdata  *pDrc;  			

	while(gsm_busy)
		os_wait(K_TMO,1,0);

	ptr = buf;
	pDrc = time;		
	gsm_busy = 1;

	for(i=0;i<10;i++)
		cmd[i]=cmd0[i];

 	get_string_clear1( );				//清空缓冲区

	put_string1(cmd, 10);   	

	for(i = 2; i>0; i--)
	{
		r_len = get_string1(buf);	 // 读应答数据
		if(r_len > 12)
			break;
	}
							  
	if(r_len < 12)	 
	{
		gsm_busy = 0;	
		return(FALSE); 
	}

	buf[127] = '\0';
	if((ptr = strstr(buf, "CCLK:")) != NULL)
	{	
		ptr += 7;		// 跳过(+CCLK: ")

		for(i=0;i<6;i++)
		{
			*pDrc = ((*ptr&0x0f)<<4) + (*(ptr+1)&0x0f);	
			pDrc++;
			ptr +=3;
		}
			   		
		gsm_busy = 0;				 		
		return(TRUE);		 		
	}		  	
	
	gsm_busy = 0;	
	return(FALSE); 						   
}
																   
/******************************************************************************/
bit		TimeCompare_(UCHAR	xdata	*sp1,UCHAR	xdata	*sp2)
{
	if(*sp1>*sp2)	return(1);
	if(*sp1<*sp2)	return(0);
	sp1++;	sp2++;

	if(*sp1>*sp2)	return(1);
	if(*sp1<*sp2)	return(0);
	sp1++;	sp2++;

	if(*sp1>*sp2)	return(1);
	if(*sp1<*sp2)	return(0); 
	sp1++;	sp2++;

	if(*sp1>*sp2)	return(1);
	if(*sp1<*sp2)	return(0);
	sp1++;	sp2++;

	if(*sp1>*sp2)	return(1);
	if(*sp1<*sp2)	return(0); 
	sp1++;	sp2++;		 

	if(*sp1>*sp2)	return(1);
	if(*sp1<*sp2)	return(0);

	return(0);
}						 
/******************************************************************************/
void  SetupTime(UCHAR xdata  *pSrc)
{	
	UCHAR xdata	buf1[33];
	UCHAR code	cmd[ ]={"AT+CCLK= 00/00/00,00:00:00+00 \r\n"}; // 命令串 
	UCHAR xdata	*sp;	

	if((sp = strchr(pSrc,',')) != NULL)
	{		 		
		sp++;
		buf1[0] = (((*sp) & 0x0f)<<4) + (*(sp+1) & 0x0f);
		sp += 2;
		buf1[1] = (((*sp) & 0x0f)<<4) + (*(sp+1) & 0x0f);
		sp += 2;
		buf1[2] = (((*sp) & 0x0f)<<4) + (*(sp+1) & 0x0f);
		sp += 2;
		buf1[3] = (((*sp) & 0x0f)<<4) + (*(sp+1) & 0x0f);
		sp += 2;
		buf1[4] = (((*sp) & 0x0f)<<4) + (*(sp+1) & 0x0f);
		sp += 2;
		buf1[5] = (((*sp) & 0x0f)<<4) + (*(sp+1) & 0x0f);
		 		
		if((TimeCompare_(buf1,time) == 1)||((memcmp(time,buf1,4) == 0)&&((time[4]-buf1[4]) == 1)))
		{								
			memcpy(buf1,cmd,32);
			sp = strchr(pSrc,',') + 1; 
			
			buf1[8] = '"';

			buf1[9]  = *sp++;
			buf1[10] = *sp++;

			buf1[12] = *sp++;
			buf1[13] = *sp++;

			buf1[15] = *sp++;
			buf1[16] = *sp++;

			buf1[18] = *sp++;
			buf1[19] = *sp++; 

			buf1[21] = *sp++;
			buf1[22] = *sp++;

			buf1[24] = *sp++;
			buf1[25] = *sp++;

			buf1[29] = '"';
						
			while(gsm_busy)
				os_wait(K_TMO,1,0);

			gsm_busy = 1;	
							   
			get_string1(buf1);

			put_string1(buf1, 32);

			get_string1(buf1);				//清空接收缓冲区

			gsm_busy = 0;
		}		
	}		  
}

/******************************************************************************/
void  gsm_status_init(void)
{			 	
	UCHAR 	i;
	UCHAR code	cmd0[ ]={"AT+CMGF=0\r\n"}; 		// 命令串 : 
	UCHAR code	cmd1[ ]={"ATE0\r\n"}; 		       	// 命令串 : 串口接收回复,关
	UCHAR code	cmd2[ ]={"AT+CNMI=3,1,0,2,0\r\n"}; 	// 命令串 : 短信提示,开
	UCHAR xdata	cmd[20]; 			// 命令串 

	while(gsm_busy)
		os_wait(K_TMO,1,0);	 		
	gsm_busy = 1;

	for(i=0;i<11;i++)
		cmd[i]=cmd0[i];	    
 	get_string_clear1( );				//清空接收缓冲区  
	put_string1(cmd, 11);   			//
						
	os_wait(K_TMO,100,0);

	for(i=0;i<6;i++)
		cmd[i]=cmd1[i];	    
 	get_string_clear1( );				//清空接收缓冲区  
	put_string1(cmd, 6);   				//串口接收回复,关
					
	os_wait(K_TMO,100,0);

	for(i=0;i<19;i++)
		cmd[i]=cmd2[i];	    
 	get_string_clear1( );				//清空接收缓冲区  
	put_string1(cmd, 19);   			//短信提示,开

	os_wait(K_TMO,10,0);
 	get_string_clear1( );				//清空接收缓冲区  

	gsm_busy = 0;
}											
																
/******************************************************************************/
void  gsm_init(void)
{			 	
	gsm_igt_0( );

	os_wait( K_TMO, 250, 0);	

	gsm_igt_1( );

	TP_DCS = GSM_8BIT;	  
}											
										
/******************************************************************************/
void	gsm_power_down(void)
{			 	
	UCHAR 	i;
	UCHAR code	cmd0[ ]={"AT+CFUN=0\r\n"}; 		// 命令串 : power down
	UCHAR xdata	cmd[11]; 			// 命令串 

	while(gsm_busy)
		os_wait(K_TMO,1,0);	 		
	gsm_busy = 1;

	for(i=0;i<11;i++)
		cmd[i]=cmd0[i];	
	put_string1(cmd,11);   			// power down
						
	os_wait(K_TMO,250,0);  
	os_wait(K_TMO,250,0);  
	os_wait(K_TMO,250,0);
	os_wait(K_TMO,250,0);			
 	get_string_clear1( );				//清空接收缓冲区  

	gsm_busy = 0;
}

/******************************************************************************/
bit	gprs_init(void)
{			 	
	UCHAR 	i,r_len;
	UCHAR xdata	buf[30]; 		
								   
 	get_string_clear1( );				//清空接收缓冲区  

	put_string1("at*e2ipa=1,1\r\n",14);   // 激活GR47 PDP连接
						
	for(i = 50; i>0; i--)			  //10s
	{
		r_len = get_string1(buf);	 // 读应答数据
		buf[r_len] = '\0';
		if(r_len > 2)
			break;
	}
	if(strstr(buf,"OK") != NULL)
	{	 		
		return(TRUE);
	}
	return(FALSE);	
}

/******************************************************************************/
void	cmd_deal_gprs(UCHAR xdata *);										 
/******************************************************************************/
bit	gprs_connect(void)
{			 	
	UCHAR 	i,r_len;
	UCHAR xdata	buf[400]; 		
	   
 	get_string_clear1( );				//清空接收缓冲区  
														 	
	put_string1("at*e2ipo?\r\n",11);   // 连接?

	for(i = 10; i>0; i--)				  //2s
	{
		r_len = get_string1(buf);	 // 读应答数据
		buf[r_len] = '\0';
		if(r_len > 6)
			break;
	}
	if(strchr(buf,'1') != NULL)	 //已经连接
	{		  
 		get_string_clear1( );				//清空接收缓冲区 	
		put_string1("ATO\r\n",5);
		for(i = 10; i>0; i--)				  //2s
		{
			r_len = get_string1(buf);	 // 读应答数据
			buf[r_len] = '\0';
			if(r_len > 6)
				break;
		}
		cmd_deal_gprs(buf);
		return(TRUE);
	} 

	put_string1("at*e2ipo=1,",11);   // 连接
	put_char1('"');	 	
	put_string1(gprs_ip,strlen(gprs_ip));   	// ip
	put_char1('"');
	put_char1(',');			   
	put_string1(gprs_port,strlen(gprs_port));	//port
	put_string1("\r\n",2);  
							
	for(i = 50; i>0; i--)		  //10s
	{
		r_len = get_string1(buf);	 // 读应答数据
		buf[r_len] = '\0';
		if(r_len > 6)
			break;
	}
	if(strstr(buf,"CONNECT") != NULL)	 //成功
	{		
		return(TRUE);
	}
	return(FALSE);	
}

/******************************************************************************/
void	gprs_close(void)
{			 	
	gprs_dtr = 0;  
	os_wait(K_TMO,30,0);
	gprs_dtr = 1; 				
}

/******************************************************************************/
bit	gprs_send(UCHAR	xdata *sp)
{			 	
	UCHAR 	m,r_len;
	UCHAR xdata	buf[400]; 

	while(gsm_busy)
		os_wait(K_TMO,1,0);	 		
	gsm_busy = 1;

 	m = 5;
	while( gprs_init( )==FALSE )
	{
		gprs_close( );     	
		m--;
		if(m == 0)	
		{		
			gsm_busy = 0;  	
			return(FALSE);	
		}	
	} 								   
 	m = 5;
	while( gprs_connect( )==FALSE )
	{
		gprs_close( );	
		m--;
		if(m == 0)	
		{		
			gsm_busy = 0;  	
			return(FALSE);	
		}	
	} 		   	
	put_string1(sp,strlen(sp));  
		
	for(m = 150; m>0; m--)		  //30s
	{
		r_len = get_string1(buf);	 // 读应答数据
		buf[r_len] = '\0';
		if(r_len > 1)
			break;
	}
	if(strstr(buf,"OK") != NULL)	 //成功
	{		
		gprs_close( ); 
		gsm_busy = 0;  
		return(TRUE);
	}
	gprs_close( ); 
	gsm_busy = 0;  	
	return(FALSE);
}

/******************************************************************************/
void	gprs_rcv(void)	 
{ 	 					 
	UCHAR 	i,r_len;
	UCHAR xdata	buf[400]; 

	while(gsm_busy)
		os_wait(K_TMO,1,0);	 		
	gsm_busy = 1;		
	   
 	get_string_clear1( );				//清空接收缓冲区 														 	
	put_string1("at*e2ipo?\r\n",11);   // 连接?

	for(i = 10; i>0; i--)				  //2s
	{
		r_len = get_string1(buf);	 // 读应答数据
		buf[r_len] = '\0';
		if(r_len > 6)
			break;
	}
	if(strchr(buf,'1') != NULL)	 //已经连接
	{		  
 		get_string_clear1( );				//清空接收缓冲区 	
		put_string1("ATO\r\n",5); 
		for(i = 10; i>0; i--)				  //2s
		{
			r_len = get_string1(buf);	 // 读应答数据
			buf[r_len] = '\0';
			if(r_len > 6)
				break;
		}
		cmd_deal_gprs(buf);	  
		os_wait(K_TMO,50,0);
		gprs_close( ); 
	} 				   
	gsm_busy = 0;  	
}
													   
/******************************************************************************/

⌨️ 快捷键说明

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