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

📄 m32.c

📁 这是用W77E58编写的控制GSM模块
💻 C
📖 第 1 页 / 共 4 页
字号:
				   gsm_task++;
				}
				else
                {
			       putstring1("No \"RING\"!\r\n");
				   putbyte('\r');                           
        	       delay_ms(20);
                   ATSend("AT\r");
				
				}
				break;
           case 4://get call number:
            	
		        ATSend("AT+CLCC\r");		  
            	ReadSerail(ans, 128, &n,5);
		    
			    putstring1("CLCC:\r\n"); 
			    putstring1(ans); 
			    putstring1("\r\n"); 
		        
			    if((strstr(ans,"+CLCC: ")) == NULL){
                    putbyte('\r');   
        			delay_ms(200);
					break;
              	
                }
        	    if((ptr=strstr(ans,",\"")) == NULL){
                    putbyte('\r');   
        			delay_ms(200);
					break;		   
			    }
                else
			    {

             	    putstring1("Phone Number=:\r\n"); 
				    putstring1(ptr); 
				    putstring1("\r\n"); 
		            ClearBuf(TPA,16);
				    if(strncpy(TPA,ptr,16)== NULL) 
					{
				      
					   putstring1("Number copy fail!\r\n"); 
				  	   putstring1("HangUpCall\r\n"); 
				  
				       HangUpCall();
                  	   SysTimer=10;
					   while(SysTimer);
                       putbyte('\r');   
				      
					   gsm_task = 0; 
                       return 0;
				    }
                    
				    putstring1("Number copy ok!\r\n"); 
				  	putstring1("HangUpCall\r\n"); 
				  	
					HangUpCall();
				    for(i=0;i<16;i++)
                    {
                      //if((i>10)&&(TPA[i]=='\"'))   
			  		  if((TPA[i]=='\"')&&(TPA[i+1]==','))   
			  		  {
					    
                          TPA[i]='\0';    //第二个"后面清0;
                       	  break;
					  }
				   }
    	  		   
				   if(strlen(TPA)<12)
				   {
				        gsm_task=0;
						return 0;
				    
				   }
				   gsm_task++;
				}
				break;
           case 5:
		        //实时查询:
		        putstring1("Check Right PhoneNumber?\r\n"); 
				if(gsmSearchPhone("M")==0 && gsmSearchPhone("A")==0 \
				   && gsmSearchPhone("B")==0 && gsmSearchPhone("C")==0 \
	               && gsmSearchPhone("D")==0)
				{
			          //如果没有设置任何授权号码,追踪器则会回复位置信息。
				      gsm_task++;
 			          break;
                }
		        if(gsmCheckRightNumber("M",0)==NULL && gsmCheckRightNumber("A",0)==NULL \ 
                   && gsmCheckRightNumber("B",0)==NULL && gsmCheckRightNumber("C",0)==NULL \
                   && gsmCheckRightNumber("D",0)==NULL)
				{
                      //如果拨打的号码不是已授权号码,追踪器不会回应
				      gsm_task=0;
 			        
				}
                //当已授权号码拨打追踪器上的号码时,追踪器会自动挂断并同时发送一条实时位置信息:
				
				TPA[0]=SCA[0];    //与短消息中心号码前两位"86" 一致。
                TPA[1]=SCA[1];
				gsm_task++;
 		   		break;
           
           case 6:
           #if 0	   
	            //2.设置短消息格式:           AT+CMGF=0<CR>                  
                sprintf(cmd, "AT+CMGF=1\r\n");    // 生成命令            (0==PDU mode)
                ATSend(cmd);                           // 先输出命令串	
				sprintf(cmd, "AT+CMGF?\r\n");     // 生成命令            (0==PDU mode)
                ATSend(cmd);                           // 先输出命令串
				ReadSerail(ptr, 128, &n,5);
			    if((ptr=strstr(ptr,"+CMGF: ")) == NULL) break;
                ptr +=7;
  			    sscanf(ptr, "%d", &n);
                if(n != 1)break;
             	            
				putstring1("Mode:\r\n"); 
			    putstring1("TEXT mode"); 
				putstring1("\r\n"); 
           #endif
				gsm_task++;
				break;
           case 7:
        		gsm_task++;
				break;
           
		   case 8:
              	gsm_task++;
				break;
           case 9:   //wait longitude & lantitude
               	ReadGPS();
		       	if(GPSReady==TRUE )
				{
                  if(GPSav ==0) 
			      {
                   	 strncpy(ans,TP_UD,strlen(TP_UD));  
                     sprintf(TP_UD,"WeakSignal,LastLocated:\r\n");
                   	 strcat(TP_UD, ans);
				   }

				   putstring1("TP_UD=:\r\n"); 
			 	   putstring1(TP_UD); 
				   putstring1("\r\n"); 
    		      
  	  			   //gpsWait=0;
				   GPSReady=FALSE;
			
				   gsm_task++;
				  
				}
            #if 0
   	            else
				{
                   if(gpsWait++>250)
     			   {
                     strncpy(ans,TP_UD,strlen(TP_UD));  
                   	 sprintf(TP_UD,"Weak Signal,last located:\r\n");
                     strcat(TP_UD, ans);

                     gpsWait=0; 
				     gsm_task=0;
  
				   }
				}
              #endif	           				
		      	break;

          case 10:  
		       if(gsmSendMessage())
			   {
		           gsm_task=0;
	               break; 
                }
                break;
		        //aLength = gsmEncodePdu(pdu);     // 根据PDU参数,编码PDU串 
	       		strcat(pdu, "\x01a");                     // 以Ctrl-Z结束          
                gsm_task++;
				break;  
          case 11:  
	            gsmString2Bytes(pdu, &nSmscLength, 2);    // 取PDU串中的SMSC信息长度     
	            nSmscLength++;                            // 加上长度字节本身   
				                                          //命令中的长度,不包括SMSC信息长度,以数据字节计     
    		    //sprintf(cmd, "AT+CMGS=%d\r", aLength/2-nSmscLength);    // 生成命令          
       			ATSend(cmd);		  
            	ReadSerail(ans, 128, &n,5);
                if((ptr=strstr(ans,"\r\n> ")) != NULL)
				        gsm_task++;
		        else
                {
                      putbyte('\r');
                      delay_ms(200);
				}                  
                break;
          case 12:  //send pdu;
			    ATSend(pdu);  // 得到肯定回答,继续输出PDU串
			  	ReadSerail(ans, 128, &n,5);
              	if((strstr(ans, "+CMGS: ")) == NULL)
				{
		           putbyte('\r');
		           delay_ms(20);
				   gsm_task=0;
				   break;
    	        }
		        else
				{
                    putstring1("SMSC ANSWER:Err\r\n"); 
				    putbyte('\r');
		           	delay_ms(200);
					gsm_task=11;
   		
				}
		  
		        break;
          case 13:  //recieve SMS
        	    ATSend("AT+CPMS=\"SM\"\r");		  
            	ReadSerail(ans, 128, &n,5);
             #if 0         
				putstring1("AT+CPMS:\r\n"); 
				putstring1(ans); 
				putstring1("\r\n"); 
		     #endif		
				if((ptr=strstr(ans,"+CPMS:")) == NULL)
				{
				    putbyte('\r');  
			        delay_ms(20);
             	    break;
				}
				gsm_task++;
	            break;  
          case 14:  
                      //设置短消息到达通知:       AT+CNMI=1,1,0,0,1<CR>          (此命令可以使GSM模块在短消息到达后向MCU发送指令:AT+CMTI:"SM",INDEX<CR>) 
                ATSend("AT+CNMI=1,1,0,0,1\r");	  //1=SM卡	  
	    	    ReadSerail(ans, 128, &n,5);
		 	    if(strstr(ans,"\r\nOK")==NULL)
				{
                     putbyte('\r');
					 break;

				}
              #if 0
                putstring1("AT+CNMI:\r\n"); 
		 	    putstring1(ans); 
				putstring1("\r\n"); 
              #endif
               
			    ATSend("AT+CNMI?\r");		  
            	ReadSerail(ans, 128, &n,5);
			  #if 0    
                putstring1("AT+CNMI?\r\n"); 
				putstring1(ans); 
				putstring1("\r\n"); 
			  #endif	
				if((ptr=strstr(ans,"+CNMI:")) == NULL)
				{
				   putbyte('\r');  
			       break;
				
				}
	            
				gsm_task++;
				break;  
          case 15:
                ReadSerail(ans, 128, &n,5);
    	   		if((ptr=strstr(ans,"+CMTI:"))== NULL)
				{
		    	    if((ptr=strstr(ans,"RING"))== NULL){
			        #if 1	
				       if(AlarmFlag==1)
   	                   {
                    	  AlarmFlag=0;
	                      gsm_task = 30;
		              }
                
			        #endif	
					   
					   break;
			        }
					else
					{
   				          putstring1("You have call!\r\n");
            		      gsm_task=4;   //get call number.  
				          break;
					}
            
			    }
				putstring1("You have message!\r\n");
				//+CMTI: "SM",17
                ptr +=12;
	        	sscanf(ptr, "%d", &index);  
		
		   		putstring1("SMS Number:\r\n"); 
			 	sprintf(cmd,"%d",index);
				putstring1(cmd); 
				putstring1("\r\n"); 
		    	
		    		
				gsm_task++;
		        break;
		  case 16:
                //index=17;
		        sprintf(cmd, "AT+CMGR=%d\r", index);    // 生成命令 
		        ATSend(cmd);		  
            	ReadSerail(ans, 256, &n,5);
      	        if((ptr=strstr(ans,"+CMGR: "))== NULL){
		      	    if((ptr=strstr(ans,"ERROR")) != NULL)
                    {
			               putbyte('\r');   
				           SysTimer=20;
                           while(SysTimer);
				    }
				    break;
			    }
			   	putstring1("\r\n"); 
				putstring1(ptr);
				putstring1("\r\n");
                ptr +=6;
				if((ptr=strstr(ptr,"\r\n"))== NULL)
				{
				     putbyte('\r');   
				     break;
			    }
				ptr +=2;  //skip \r\n
	            gsmDecodePdu(ptr); 
        	    gsmDeleteSms(index);

				 
				if(gsmDoUserTask(TP_UD)==2)
				{
				   gsm_task=0;
                   break;
				}
			    gsm_task++; 
					 
				putbyte('\r');   
		        break;
           case 17:
                TPA[0]=SCA[0];
                TPA[1]=SCA[1];
				gsm_task = 10;             //send message
	            break;
 
	     
		  
		  case 25:
		        
                if(gsmSearchPhone("MASTER")==TRUE)
			    {
                     gsm_task++;              
				}
				//else
                    //ATSend("ATD13554997942;\r\n");              
				gsm_task++;
			   	break;
		  case 30:
		       //紧急报警:追踪器前面的红色按钮为一个紧急按钮,当它为按下,追踪器会发送"Help me!"和地理位置信息到所有已授权号码。
			   	ReadGPS();
          
		  #if 0                
				putstring1("JWD?\r\n");
                putstring1(TP_UD);
                putstring1("\r\n");
          #endif

         		strncpy(ans,TP_UD,strlen(TP_UD));  
                sprintf(TP_UD,"Help me!\r\n");
                strcat(TP_UD, ans);
		 		
				if(gsmGetRightNumber("M"))
				{
				    
					gsmSendMessage();
		        
				} 
		        if(gsmGetRightNumber("A"))
				{
				    
					gsmSendMessage();
		        
				} 
		        if(gsmGetRightNumber("B"))
				{
				    
					gsmSendMessage();
		        
				} 
		        
				if(gsmGetRightNumber("C"))
				{
				    
					gsmSendMessage();
		        
				} 
		        if(gsmGetRightNumber("D"))
				{
				    
					gsmSendMessage();
		        
				} 
		    	gsm_task=0;   
                break;
    	 case 40:
		       //追踪器每隔30 S回复一条地理位置信息
			   	ReadGPS();
           #if 0
		 		putstring1("JWD?\r\n");
                putstring1(TP_UD);
                putstring1("\r\n");
        
 				putstring1("TPA=:\r\n");
                putstring1(TPA);
                putstring1("\r\n");
           #endif
				if(gsmSendMessage())
				{
			      if(GPSTimerReq==TRUE)
	              {
                    GPSTimer30=_30_SEC;

	              }
				  gsm_task=0;   
                }
				break;

          
		 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 + -