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

📄 bak-m32.c

📁 这是用W77E58编写的控制GSM模块
💻 C
📖 第 1 页 / 共 2 页
字号:
 1.设置短消息中心号码:       AT+CSCA="+8613800755500" <CR>. (地区不同,设置不同)
 2.设置短消息格式:           AT+CMGF=0<CR>                  (0==PDU mode)
 3.设置短消息存放的位置:     AT+CPMS="SM"<CR>               (SM表示将短消息存放在SIM卡中) 
 4.设置短消息到达通知:       AT+CNMI=1,1,0,0,1<CR>          (此命令可以使GSM模块在短消息到达后向MCU发送指令:AT+CMTI:"SM",INDEX<CR>)

*****************************************************************************************************************/
void gsmModule_init(void)
{
    
      int xdata i,nNumRead;
      char xdata* ptr; 
     
	  GSM_PWON=HIGH;
      delay_ms(5);
      GSM_PWON=LOW;
      delay_ms(200);   //Over 120 ms,M32 power on.
      GSM_PWON=HIGH;
      delay_ms(200);   
      
      gsm_task = 0;    

      sprintf(cmd, "AT\r\n");             // 生成命令  
      putstring(cmd);                           // 先输出命令串

      delay_ms(200);   
      
	  sprintf(cmd, "AT\r\n");             // 生成命令  
      putstring(cmd);                           // 先输出命令串
         
	  SysTimer=20;
	  while(SysTimer);
      
	  

	 
}




void HangUpCall(void)
{

      //sprintf(cmd, "AT+CHUP\r\n");             // 生成命令  
      sprintf(cmd, "ATH\r\n");             // 生成命令  
      putstring(cmd);                           // 先输出命令串

}


void RecieveCall(void)  //接电话,回应呼叫
{

      sprintf(cmd, "ATA\r\n");                  // 生成命令  
      putstring(cmd);                           // 先输出命令串


}


void Recall(void)
{
      sprintf(cmd, "ATDL\r\n");                  // 生成命令  
      putstring(cmd);                           // 先输出命令串


}



//AT+CPAS :查询模块当前活动状态
uchar gsmStatus(void)
{
      int xdata i,n;
      uchar xdata* ptr;
      uchar xdata* psr;
     
	  ptr=ans;
   	  switch(gsm_task)
	  {
           case 0:
              	gsm_task++;
				break;

           case 1: //check GSM status:
                sprintf(cmd, "AT+CPAS\r\n");                  // 生成命令  
                putstring(cmd);                           // 先输出命令串
                ReadSerail(ptr, 128, &n,5);
                if((ptr=strstr(ptr,"+CPAS:")) != NULL)
                {
                    ptr +=6;
	                sscanf(ptr, "%d", &n);   
 		            if(n==0)                                    //0--  ready
		            {
                       //putstring("ATD13554997942;\r\n");                           // 先输出命令串

		            }   
	                else
 		            if(n==3)                                     //3--ring
		            {
                        gsm_task=2;   //check "RING" ?   
                    }   
	                else
                    if(n==5)                         //5-- asleep
		            {
                    }   
	                  
			    }
              	break;
           case 2: //check ring ?
    		    ReadSerail(ptr, 128, &n,5);
                if((ptr=strstr(ptr,"RING")) != NULL)
   	            {
                   delay_ms(200);
				   SysTimer=15;
				   gsm_task++;
				}
				else
                if((ptr=strstr(ptr,"NO CA")) != NULL)
                {
                   //putstring("ATD13554997942;\r\n");                           // 先输出命令串
                      
				
				}
		        break;
           case 3://get call number:
                sprintf(cmd, "AT+CLCC\r\n");                  // 生成命令  
                putstring(cmd);                           // 先输出命令串
                ReadSerail(ptr, 128, &n,5);
                if((ptr=strstr(ptr,"+CLCC: ")) != NULL)
                {
                    HangUpCall(); 	        
	            
					SysTimer=50;
                    while(SysTimer);
				 #if 1
               		//目标号码或回复号码(TP-DA或TP-RA)
			        if((psr=strstr(ptr,",\"")) != NULL)
					{     gsm_task=11;
					      return 0;
					      psr +=1;  //skip ','
					      if(strncpy(TPA,psr,16) != NULL)  //TPA[]="+8613800755500"
                          {
                             for(i=0;i<16;i++)
                             {
                                if((i>2)&&(TPA[i]=='\"'))   
								{
								   TPA[i+1]=0;    //第二个"后面清0;
                                   break;
					         	}
							 }
	                 
                             if(strncpy(ptr,TPA,strlen(TPA)) != NULL)  
                             {
                                  ptr[strlen(TPA)+1]=0;
							      ptr +=1;
						         #if 0   //DEBUG return call.	
							        sprintf(pdu, "ATD");                      // 生成命令  
                                    strcat(pdu, ptr);
                                    strcat(pdu, ";\r\n");
    						        putstring(pdu);                           // 先输出命令串
		                            gsm_task=0;
					             #else
						    
							        gsm_task=4;         //start recieve GPS & send massage                        
						            return 0; 
						       	#endif
                               

							 }
					        
				        	   
						  }
				    }
                  
				 #else		
					//目标号码或回复号码(TP-DA或TP-RA)
					if((ptr=strstr(ptr,",\"")) != NULL)
				    {
					  
					   ptr +=2;  
					   for(i=0;i<128;i++)
					   {
                         if ((ptr[i]=='\"') && (ptr[i+1]=','))
       				     {
						    ptr[i]=0;
						    //TPA[16];                  // 目标号码或回复号码(TP-DA或TP-RA) 
						 #if 0   //DEBUG return call.	
							sprintf(pdu, "ATD");                      // 生成命令  
                            strcat(pdu, ptr);
                            strcat(pdu, ";\r\n");
    						putstring(pdu);                           // 先输出命令串
		                    gsm_task=0;
					      #else
						    
							gsm_task=4;         //start recieve GPS & send massage                        
						    return 0; 
						  #endif
						}
					   
					   }

				  
                	}
	             #endif      
			    }
    	        break;
           case 4://start recieve GPS:
                //0。读短消息中心号码:
                sprintf(cmd, "AT+CSCA?\r\n");             // 生成命令  
                putstring(cmd);                           // 先输出命令串
	            ReadSerail(ptr, 128, &n,5);
	            if((ptr=strstr(ptr, "+CSCA: ")) != NULL)
				{ 
   			        #if 1 
		               if((psr=strstr(ptr, "\"+")) != NULL)
				       {
					      if(strncpy(SCA,psr,16) != NULL)  //SCA[]="+8613800755500"
                          {
                             for(i=0;i<16;i++)
                             {
                                if((i>2)&&(SCA[i]=='\"'))   
								{
								   SCA[i+1]=0;    //第二个"后面清0;
                                   psr +=16;
                                   strncpy(cmd,psr,6);      
	                               cmd[6]=0;  
                                   SysTimer=50;    
	                               while(SysTimer);
                	 		       gsm_task=5; 
	                               
								   break;
								}
							 }
				           }
					   }
				
			       #else
                       if((psr=strstr(ptr, "\"+")) != NULL)
				       {
					      if(strncpy(SCA,psr,16) != NULL)  //SCA[]="+8613800755500"
                          {
                             SCA[16]=0;                    //get SCA address Ok.
				             psr +=16;
                             strncpy(cmd,psr,6);      
	                         cmd[6]=0;  
                             SysTimer=50;    
	                         while(SysTimer);
                	 		 gsm_task=5; 
	                      }
					   }
				   #endif
			    }
                break;
           case 5:
	           //1.设置短消息中心号码:       AT+CSCA="+8613800755500" <CR>. (地区不同,设置不同)
                sprintf(ptr, "AT+CSCA=");             // 生成命令  
	            //strncat(ptr, SCA,16);
                strncat(ptr, SCA,strlen(SCA));
            	ptr[8]='\"';
                //ptr[23]='\"';
                ptr[strlen(SCA)+7]='\"';
            	strcat(ptr, cmd);
                putstring(ptr);                   // 先输出命令串   
				
				gsm_task++;
	            break;

           case 6:
	            //2.设置短消息格式:           AT+CMGF=0<CR>                  
                sprintf(cmd, "AT+CMGF=1\r\n");         // 生成命令            (0==PDU mode)
                putstring(cmd);                   // 先输出命令串
            	
				sprintf(cmd, "AT+CMGF?\r\n");         // 生成命令            (0==PDU mode)
                putstring(cmd);                   // 先输出命令串
           	    ReadSerail(ptr, 128, &n,5);
			    if((ptr=strstr(ptr,"+CMGF: ")) != NULL)
                {
				    
					  gsm_task=11;
					  break;
			    }
			    break;
          case 7:
               	
		
			    //查询:  AT+CMGF?      (answer: +CMGF=0/1 OK)  
		        break;
           case 8:
                //3.设置短消息存放的位置:     AT+CPMS="SM"<CR>               (SM表示将短消息存放在SIM卡中)
                sprintf(cmd, "AT+CPMS=\"SM\"\r\n");    // 生成命令  
                putstring(cmd);                        // 先输出命令串
                ReadSerail(ptr, 128, &n,5);
			    if((ptr=strstr(ptr,"+CPMS:")) != NULL) gsm_task=9;
          		break;
           case 9:
                //4.设置短消息到达通知:       AT+CNMI=1,1,0,0,1<CR>          (此命令可以使GSM模块在短消息到达后向MCU发送指令:AT+CMTI:"SM",INDEX<CR>) 
                sprintf(cmd, "AT+CNMI=1,1,0,0,1\r\n");    // 生成命令  
	            putstring(cmd);                        // 先输出命令串
                delay_ms(200);
				sprintf(cmd, "AT+CNMI?\r\n");    // 生成命令  
	            putstring(cmd);                        // 先输出命令串
                ReadSerail(ptr, 128, &n,5);
			    if((ptr=strstr(ptr,"+CNMI:")) != NULL) gsm_task=10;

		        break;
          case 10:
              
		       //SCA[16];                   // 短消息服务中心号码(SMSC地址)     
               // TPA[16];                  // 目标号码或回复号码(TP-DA或TP-RA) 
                TP_PID=0;                   // 用户信息协议标识(TP-PID)     
                TP_DCS=GSM_8BIT;            // 用户信息编码方式(TP-DCS)     
                //TP_SCTS[16];              // 服务时间戳字符串(TP_SCTS), 接收时用到     
                //TP_UD[161];               // 原始用户信息(编码前或解码后的TP-UD)     
                //strncmp(TP_UD,m_Buffer,10);
           	    sprintf(TP_UD, "TEST GWM!");

			   	index=0;                   // 短消息序号,在读取时用到 
		        gsm_task++;
		        //gsmSendMessage();
		      	break;


           case 11:
				SysTimer=50;
				while(SysTimer);
                putstring("ATD13554997942;\r\n");
		        gsm_task=0;

		        break;

 	         
		     #if 0   
				SysTimer=50;
				while(SysTimer);
                putstring("ATD13554997942;\r\n");
		        gsm_task++;
             #endif


          default:
                break;


	  }
	  return 7;
}

//AT+CLCC:列出当前呼叫



//AT+CLIP?

/*
在使用AT命令设置显示呼入号码时,应注意AT+CLIP、AT+CLCC及AT^SCNI三者的区别:虽然三者都在有语音呼入时显示对方号码,
但AT+CLCC与AT^SCNI,只对当前呼叫的当前振铃有效;而AT+CLIP 有效期从开机设置至关机,对所有呼叫的所有振铃均有效。 

*/

⌨️ 快捷键说明

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