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

📄 m32.c

📁 w77E58开发的具备蓝牙功能的GPS导航仪
💻 C
📖 第 1 页 / 共 4 页
字号:
}      




/*****************************************************************************************************
*             int gsmDecode7bit(const unsigned char* pSrc, char* pDst, int nSrcLength) 
*
* 7-bit解码 
* pSrc: 源编码串指针 
* pDst: 目标字符串指针 
* nSrcLength: 源编码串长度 
* 返回: 目标字符串长度 
*******************************************************************************************************/
//int gsmDecode7bit(const unsigned char* pSrc, char* pDst, int nSrcLength) 
int gsmDecode7bit(uchar* pSrc, char * pDst, int nSrcLength) 
{ 
     int nSrc;               // 源字符串的计数值     
     int nDst;               // 目标解码串的计数值     
     int nByte;              // 当前正在处理的组内字节的序号,范围是0-6     
     unsigned char nLeft;    // 上一字节残余的数据        
     
     // 计数值初始化     
     nSrc = 0;     
	 nDst = 0;    
     // 组内字节序号和残余数据初始化     
     nByte = 0;     
	 nLeft = 0;    
     // 将源数据每7个字节分为一组,解压缩成8个字节     
     // 循环该处理过程,直至源数据被处理完     
     // 如果分组不到7字节,也能正确处理     
     while(nSrc<nSrcLength)     
     {         
       // 将源字节右边部分与残余数据相加,去掉最高位,得到一个目标解码字节    
       *pDst = ((*pSrc << nByte) | nLeft) & 0x7f;         
       // 将该字节剩下的左边部分,作为残余数据保存起来         
        nLeft = *pSrc >> (7-nByte); 
       // 修改目标串的指针和计数值         
        pDst++;         
		nDst++;   
       // 修改字节计数值         
        nByte++;              
       // 到了一组的最后一个字节         
       if(nByte == 7)         
       {             
          // 额外得到一个目标解码字节             
          *pDst = nLeft; 
          // 修改目标串的指针和计数值             
          pDst++;             
		  nDst++; 
          // 组内字节序号和残余数据初始化             
          nByte = 0;             
          nLeft = 0;         
       }              
       // 修改源串的指针和计数值         
       pSrc++;         
       nSrc++;     
     }          
     *pDst = 0;          
     // 返回目标串长度     
     return nDst; 
} 




 // PDU解码,用于接收、阅读短消息 
 // pSrc: 源PDU串指针 
 // pDst: 目标PDU参数指针 
 // 返回: 用户信息串长度 
 int gsmDecodePdu(char * pSrc) 
 {     
 	int nDstLength;           // 目标PDU串长度     
	unsigned char tmp;        // 内部用的临时字节变量     

   	// SMSC地址信息段     
 	gsmString2Bytes(pSrc, &tmp, 2);    // 取长度     
 	tmp = (tmp - 1) * 2;               // SMSC号码串长度     
 	pSrc += 4;                         //指针后移     
	gsmSerializeNumbers(pSrc, SCA, tmp);    

#if 0 	
	putstring1("SCA=\r\n");
	putstring1(SCA);
	putstring1("\r\n");
#endif	


	// 转换SMSC号码到目标PDU串     
 	pSrc += tmp;        
#if 0	
	putstring1("pSrc=\r\n");
	putstring1(pSrc);
	putstring1("\r\n");                //040D9168
#endif 	
	// 指针后移          
 	// TPDU段基本参数、回复地址等     
 	gsmString2Bytes(pSrc, &tmp, 2);    
	                                    //tmp=04  No return back addr
										//tmp=84  have return back addr 
	// 取基本参数     
 	pSrc += 2;        
 	// 指针后移     
#if 0
   	putstring1("pSrc=\r\n");
	putstring1(pSrc);
	putstring1("\r\n");                //0D9168
#endif
	
	 
	//if(tmp & 0x80)                       
 	 {         
 		// 包含回复地址,取回复地址信息         
 		gsmString2Bytes(pSrc, &tmp, 2);    // 取长度       
        if(tmp==13)putstring1("13\r\n");

 		if(tmp & 1) tmp += 1;    // 调整奇偶性         
        if(tmp==14)putstring1("14\r\n");
 		
		
		pSrc += 4;          
 		// 指针后移         
 		gsmSerializeNumbers(pSrc, TPA, tmp);    
 		// 取TP-RA号码         
 	#if 0 
	   	putstring1("TPA=\r\n");
		putstring1(TPA);
		putstring1("\r\n");
    #endif		
		pSrc += tmp;        
 		// 指针后移     
 	 }          


	 // TPDU段协议标识、编码方式、用户信息等     
 	 gsmString2Bytes(pSrc, (unsigned char*)&TP_PID, 2);         // 取协议标识(TP-PID)     
	 pSrc += 2;        // 指针后移        

 	 gsmString2Bytes(pSrc, (unsigned char*)&TP_DCS, 2);    // 取编码方式(TP-DCS)     
 	 pSrc += 2;        // 指针后移     
 	 gsmSerializeNumbers(pSrc, TP_SCTS, 14);                    // 服务时间戳字符串(TP_SCTS)      
 	 pSrc += 14;       // 指针后移     
 	 gsmString2Bytes(pSrc, &tmp, 2);    // 用户信息长度(TP-UDL)     
 	 pSrc += 2;        // 指针后移     


 	 if(TP_DCS == GSM_7BIT)         
 	 {         
 		// 7-bit解码         
 		nDstLength = gsmString2Bytes(pSrc, ans, tmp & 7 ? (int)tmp * 7 / 4 + 2 : (int)tmp * 7 / 4);  
 		// 格式转换         
 		gsmDecode7bit(ans, TP_UD, nDstLength);    
	   	
		putstring1("TP_UD=\r\n");
		putstring1(TP_UD);
		putstring1("\r\n");
 		

		// 转换到TP-DU         
 		nDstLength = tmp;     
 	  }     
	  else if(TP_DCS == GSM_UCS2)     
 	  {         
 	    #if 0
   	     // UCS2解码         
 		  nDstLength = gsmString2Bytes(pSrc, ans, tmp * 2);          // 格式转换         
 		  nDstLength = gsmDecodeUcs2(ans, TP_UD, nDstLength);    // 转换到TP-DU     
 	    #endif
      }     
 	  else     
 	  {         
 			// 8-bit解码         
 		 nDstLength = gsmString2Bytes(pSrc, ans, tmp * 2);       // 格式转换         
 		 //nDstLength = gsmDecode8bit(ans, TP_UD, nDstLength);    // 转换到TP-DU     
      }          

	 
      //返回目标字符串长度     
      return nDstLength; 
} 


int gsmDeleteSms(int xdata index)
{
       int xdata n;
       ClearBuf(ans,256);  
       sprintf(ans,"AT+CMGD=");
       sprintf(cmd,"%d",index);
	   strcat(ans,cmd);
       strcat(ans,"\r\n");
       
	   putstring1(ans);
	   putstring1("\r\n");
	   
	   SysTimer=_10_SEC;
       while(SysTimer)
	   {
	     ATSend(ans); 
         ReadSerail(ans, 128, &n,5);  
         if((strstr(ans,"OK"))!= NULL) return 1;
         ATSend("AT\r\n");
		 delay_ms(20);
      }

}








/**************************************************************************************************************

   GSM_IO10: L->H-L,H=40-50 ms,wake up MCU,and gsm set IO11 to low.
   GSM_ROW4:              ,Wake up GSM.


   Host to GSM:   check GSM sleep? if yes,Host pull low GSM_ROW4 to low 50 ms,at once send AT command.
**************************************************************************************************************/
// SM        station
// MS        Me
/*****************************************************************************************************************
 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)
{
    
    
	  GSM_PWON=HIGH;
      delay_ms(5);
      GSM_PWON=LOW;
      delay_ms(200);   //Over 120 ms,M32 power on.
      GSM_PWON=HIGH;
      delay_ms(200);   
     
	  putbyte('A');
      putbyte('T');
      putbyte('\r');

      gsm_task = 0;    
      AlarmFlag = FALSE; 
   	  SysTimer=20;
	  while(SysTimer);

      //
           
	   
      putbyte('A');
      putbyte('T');
      putbyte('\r');
      SysTimer=20;
	  while(SysTimer);
	 
      putstring1("\r\n");
      putstring1("Reset GSM Module OK!\r\n");
      //AlarmFlag = 1;      
      //sprintf(cmd, "ATD13554997942;\r\n");                  // 生成命令  
      //putstring(cmd);                           // 先输出命令串
      ClearBuf(SCA,16);       	      
	 
}




void HangUpCall(void)
{

      //sprintf(cmd, "AT+CHUP\r\n");             // 生成命令  
      ATSend("ATH\r\n");             // 生成命令  

}


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

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


}


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


}




//int xdata gpsWait;


uchar gsmMain(void)
{
      int i,n;
	  unsigned char nSmscLength;          // SMSC串长度 
      uchar xdata* ptr;
     
    
       if(GPSTimerReq==TRUE)
	  {
         if(GPSTimer30==0)
   	     {
            GPSTimer30=_30_SEC;
            gsm_task = 40; 

		 }


	  }
            

      
	  switch(gsm_task)
	  {
           case 0:
              	ATSend("AT\r");
			    ReadSerail(ans, 128, &n,5);
                if(strstr(ans,"\r\nOK")==NULL)
				{
                    putbyte('\r');
                    delay_ms(200);
				    break;
				}

                putstring1("\r\n");
        		putstring1("Start Debug GSM:\r\n");
       	
                			        
               	gsmInitPhoneBook();

			
      #if 0
                gsmDeletePhone(1);
				//gsmPhoneBookTask(GSM_DELET_PHONE,NULL,NULL,1);
				
				ATSend("AT+CPBF=\"GWM\"\r");		  
            	ReadSerail(ans, 256, &n,5);
                putstring1(ans); 
                putstring1("\r\n");
	  #endif			
				gsm_task++;
				break;

           case 1:                 
				if(strlen(SCA))
				{
				   gsm_task++;
		           break;
				}
				putstring1("Read SMC:\r\n"); 
			    //读短消息中心号码:
  				ATSend("AT+CSCA?\r");		  
            	ReadSerail(ans, 128, &n,5);
				if((strstr(ans, "+CSCA: ")) == NULL)
				{
                    putbyte('\r');   
			        delay_ms(20);
					break;
				}
				if((ptr=strstr(ans, "\"+")) == NULL)
				{
			        putbyte('\r');   
				    delay_ms(20);
					break;
                
				}	
				else				   
   				{
				     ptr +=2;  //skip '"+'
				     if(strncpy(SCA,ptr,16) != NULL)  //SCA[]="+8613800755500"
                     {
                         for(i=0;i<16;i++)
                         {
                            if((SCA[i]=='\"') && (SCA[i+1]==',') )   
						    {
								SCA[i]=0;    //第二个"后面清0;
                            	
								putstring1("SCA:\r\n"); 
			                    putstring1(SCA); 
				                putstring1("\r\n"); 
		                	  
				                TP_PID=0;                   // 用户信息协议标识(TP-PID)     
                                TP_DCS=GSM_7BIT;            // 用户信息编码方式(TP-DCS)     
                                //TP_SCTS[16];              // 服务时间戳字符串(TP_SCTS), 接收时用到     
                          	    index=0;                   // 短消息序号,在读取时用到 
							    gsm_task++;
								break;
						   }
					    }
				   }
			    }
                break;

           case 2: //check GSM status:
             	ATSend("AT+CPAS\r");		  
            	ReadSerail(ans, 128, &n,5);
	           	if((ptr=strstr(ans,"+CPAS: ")) != NULL)
                {
                    ptr +=6;
					sscanf(ptr, "%d", &n);   
					if(n==0)                                    //0--  ready
		            {
                      
					   putstring1("Check SMS!\r\n");
				       gsm_task=13;   //check "RING" ?   
					   		
					
					}   
	                else
 		            if(n==3)                                     //3--ring
		            {
                      //putstring1("Check Ring!\r\n");  
					  gsm_task=3;   //check "RING" ?   
 	        					
					}   
	                else
                    if(n==5)                         //5-- asleep
		            {
                      
				    }    
	                  
			    }
                else
				{
                   
					
					putbyte('\r');
				    delay_ms(200);

				}
				break;
           case 3: //check ring ?
			    ReadSerail(ans, 128, &n,5);
			   	if((ptr=strstr(ans,"RING")) != NULL)
   	            {
                   putstring1("RING!\r\n");

⌨️ 快捷键说明

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