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

📄 m32.c

📁 这是用W77E58编写的控制GSM模块
💻 C
📖 第 1 页 / 共 4 页
字号:
 {     
 	code char tab[]="0123456789ABCDEF";    
 	
	int i;
	// 0x0-0xf的字符查找表          
 	for(i=0; i<nSrcLength; i++)     
 	{         
 		// 输出低4位         
 		*pDst++ = tab[*pSrc >> 4];   
 	        // 输出高4位         
 	        *pDst++ = tab[*pSrc & 0x0f];              
 	        pSrc++;     
 	}          
 	// 输出字符串加个结束符     
 	*pDst = '\0';          
 	// 返回目标字符串长度     
 	return nSrcLength * 2; 
 }

// 可打印字符串转换为字节数据 // 如:"C8329BFD0E01" --> {0xC8, 0x32, 0x9B, 0xFD, 0x0E, 0x01}
 // pSrc: 源字符串指针 
 // pDst: 目标数据指针 
 // nSrcLength: 源字符串长度 
 // 返回: 目标数据长度 
 //int gsmString2Bytes(const char* pSrc, unsigned char* pDst, int nSrcLength) 
 int gsmString2Bytes(uchar* pSrc, uchar* pDst, int nSrcLength) 
 {   
 	  int i;
	   
       
	  for(i=0; i<nSrcLength; i+=2)     
 	  {         
 	  	// 输出高4位         
 	  	if((*pSrc>='0') && (*pSrc<='9'))         
 	  	{             
 	  		*pDst = (*pSrc - '0') << 4;         
            	    
		
		}         
 	    else         
 	    {             
 	        *pDst = (*pSrc - 'A' + 10) << 4;         
 	    }              
 	    				
		
		pSrc++;              
 	    // 输出低4位        
 	    if(*pSrc>='0' && *pSrc<='9')         
 	    {             
 	        	*pDst  |= (*pSrc - '0');         
 	    }         
 	    else         
 	    {             
 	        	*pDst  |= (*pSrc - 'A' + 10);         
 	    }         
       	
	
		
		pSrc++;         
 	    pDst++;  

 	  }          
           
	  
#if 0   
	  for(i=0; i<nSrcLength; i+=2)     
 	  {         
 	  	// 输出高4位         
 	  	if((*pSrc>='0') && (*pSrc<='9'))         
 	  	{             
 	  		*pDst = (*pSrc - '0') << 4;         
            	    
		
		}         
 	    else         
 	    {             
 	        	*pDst = (*pSrc - 'A' + 10) << 4;         
 	    }              
 	    
		
		
		
		pSrc++;              
 	    // 输出低4位        
 	    if(*pSrc>='0' && *pSrc<='9')         
 	    {             
 	        	*pDst  = *pSrc - '0';         
 	    }         
 	    else         
 	    {             
 	        	*pDst  = *pSrc - 'A' + 10;         
 	    }         
       	pSrc++;         
 	    pDst++;  

 	  }          
#endif
 	  // 返回目标数据长度     
 	  return nSrcLength / 2; 
 }      


 
/**************************************************************************************************
//PDU串中的号码和时间,都是两两颠倒的字符串。利用下面两个函数可进行正反变换:
// 正常顺序的字符串转换为两两颠倒的字符串,若长度为奇数,补''F''凑成偶数 // 如:"8613851872468" --> "683158812764F8" 
// pSrc: 源字符串指针 
// pDst: 目标字符串指针 
// nSrcLength: 源字符串长度 
// 返回: 目标字符串长度 
****************************************************************************************************/
//int gsmInvertNumbers(const char* pSrc, char* pDst, int nSrcLength) 
int gsmInvertNumbers(char xdata* pSrc, char xdata* pDst, int nSrcLength) 
{     


    int nDstLength;   // 目标字符串长度     
	char ch;          // 用于保存一个字符          
	int i;

	// 复制串长度     
	nDstLength = nSrcLength;          
	// 两两颠倒     
	for(i=0; i<nSrcLength;i+=2)     
	{         
	    ch = *pSrc++;        // 保存先出现的字符         
	    *pDst++ = *pSrc++;   // 复制后出现的字符         
	    *pDst++ = ch;        // 复制先出现的字符     
    }          
    // 源串长度是奇数吗?     
    if(nSrcLength & 1)     
    {         
            *(pDst-2) = 'F';     // 补''F'' 
            nDstLength++;        // 目标串长度加1     
    }          
    // 输出字符串加个结束符     
    *pDst = '\0';          
    // 返回目标字符串长度     
    return nDstLength; 
}      


// 两两颠倒的字符串转换为正常顺序的字符串
// 如:"683158812764F8" --> "8613851872468"
// pSrc: 源字符串指针
// pDst: 目标字符串指针
// nSrcLength: 源字符串长度
// 返回: 目标字符串长度
int gsmSerializeNumbers(char* pSrc, char* pDst, int nSrcLength)
{
    int i,nDstLength;   // 目标字符串长度
    char ch;          // 用于保存一个字符
    
    // 复制串长度
    nDstLength = nSrcLength;
    
    // 两两颠倒
    for(i=0; i<nSrcLength;i+=2)
    {
        ch = *pSrc++;        // 保存先出现的字符
        *pDst++ = *pSrc++;   // 复制后出现的字符
        *pDst++ = ch;        // 复制先出现的字符
    }
    
    // 最后的字符是'F'吗?
    if(*(pDst-1) == 'F')
    {
        pDst--;
        nDstLength--;        // 目标字符串长度减1
    }
    
    // 输出字符串加个结束符
    *pDst = '\0';
    
    // 返回目标字符串长度
    return nDstLength;
}






uchar gsmDoUserTask(uchar* task)
{
 
        uchar xdata* ptr;
        if(task[0]!='M' && task[0] != 'A' && task[0] != 'B' && task[0] != 'C' && task[0]!='D'&& task[0]!='T')
		{  //如果你编辑了错误短信:check ok
	           sprintf(TP_UD,"Fail");   //gsmSendMessage("Fail");   
		       return 0;
        }
		if(strncmp(task,"TM30S",5)==0)
		{//定时跟踪:设置追踪器每隔30 S回复一条地理位置信息
            if(gsmCheckRightNumber("M",0)==NULL && gsmCheckRightNumber("A",0)==NULL \ 
                   && gsmCheckRightNumber("B",0)==NULL && gsmCheckRightNumber("C",0)==NULL \
                   && gsmCheckRightNumber("D",0)==NULL)
		    {
                //如果不是已授权号码,追踪器不会回应
                 return 2;
			}
			
			GPSTimerReq=1;
			GPSTimer30=0;
            sprintf(TP_UD,"Timer 30 s!");
            return 1;
		}
		else
		if(strncmp(task,"TM",2)==0)
		{//取消自动回复功能方法:发送一条短信"TM"到追踪器,就可以完成删除。

            if(gsmCheckRightNumber("M",0)==NULL && gsmCheckRightNumber("A",0)==NULL \ 
                   && gsmCheckRightNumber("B",0)==NULL && gsmCheckRightNumber("C",0)==NULL \
                   && gsmCheckRightNumber("D",0)==NULL)
		    {
                //如果不是已授权号码,追踪器不会回应
                 return 2;
			}

		    GPSTimerReq=0;
            GPSTimer30=0;
			sprintf(TP_UD,"Cancel Timer 30 s!");
            return 1;
		}

        
		putstring1("Del Right Number:"); 
	
		if(task[1] == '\0')
        {
           //delete: 
           if(gsmSearchPhone(task)==0)
		   {      //非授权号码,不能删除
                  sprintf(TP_UD,"You are not master!");   
                  return 0;
		   }
	       
		   if(gsmDeletePhone(gsmSearchPhone(task)))
 		   {
        		  sprintf(TP_UD,"OK");
                  return 1;
           }
		   else 
		   {
		          sprintf(TP_UD,"Fail");   //gsmSendMessage("Fail");   
		          return 0;  
           }   
        } 
        
        
        putstring1("Set Right Number:"); 

        if((ptr=strstr(task,"M")) != NULL)    //设置主授权号码
		{    //设置授权:Master
             ptr++;
		     putstring1("Phone Number to Save:\r\n");
             putstring1(ptr);
			 putstring1("\r\n");
		
           	 if(gsmSavePhone(ptr,"M")==TRUE)     //起名为:M
		     //if(gsmPhoneBookTask(GSM_SAVE_PHONE,ptr,"M",PhoneNumber))
			 {
                       
				  putstring1("Save Phone Ok,Number is:\r\n");
			      sprintf(TPA,"++");
				  strcat(TPA, ptr);
				  putstring1(TPA);
			      putstring1("\r\n");
			      
				  sprintf(TP_UD,"OK");

				  return 1;    //gsmSendMessage("OK"); 
				      
			 }
			 else
             {      
				  putstring1("Save Phone Fail!");
			      sprintf(TP_UD,"Fail");   //gsmSendMessage("Fail"); 
         	      return 0;	
				  
		     }

		}
        
        if(task[0] == 'A')                 //设置第一个受权号码
        {
          //if(gsmPhoneBookTask(GSM_SEARCH_PHONE,NULL,"M",0))
		  if(gsmSearchPhone("M"))          //是否有主授权号码?
          {
		    if((ptr=strstr(task,"A")) != NULL)
		    {   
                //增加授权:
             
                ptr++;
		        putstring1("Phone Number to Save:\r\n");
                putstring1(ptr);
			    putstring1("\r\n");
		        PhoneNumber=2;
				//if(gsmPhoneBookTask(GSM_SAVE_PHONE,ptr,"A",PhoneNumber))
           	    if(gsmSavePhone(ptr,"A")==TRUE)  //第一个授权,起名为:A
		        {
                       
				  putstring1("Save Phone Ok,Number is:\r\n");
			      sprintf(TPA,"++");
				  strcat(TPA, ptr);
				  putstring1(TPA);
			      putstring1("\r\n");
			      
				  sprintf(TP_UD,"OK");

				  return 1;                //gsmSendMessage("OK"); 
				      
			    }
			    else
                {      
				  putstring1("Save Phone Fail!");
			      sprintf(TP_UD,"Fail");   //gsmSendMessage("Fail"); 
         	      return 0;	
				  
		        }



		    }//if((ptr=strstr(task,"A")) != NULL)
          }//if(gsmSearchPhone("M"))
          else
 		  {

                  sprintf(TP_UD,"You are not master!");   
         	      return 0;	


		  }


        }//if(task[0] == 'A')
        
        if(task[0] == 'B')                 //设置第二个受权号码
        {
          //if(gsmPhoneBookTask(GSM_SEARCH_PHONE,NULL,"A",0))
		  if(gsmSearchPhone("A"))          //是否有第一个受权号码?
          {
		    if((ptr=strstr(task,"B")) != NULL)
		    {   
                //增加授权:
             
                ptr++;
		        putstring1("Phone Number to Save:\r\n");
                putstring1(ptr);
			    putstring1("\r\n");
		        PhoneNumber=3;
				//if(gsmPhoneBookTask(GSM_SAVE_PHONE,ptr,"M",PhoneNumber))
           	    if(gsmSavePhone(ptr,"B")==TRUE)  //第2个授权,起名为:B
		        {
                       
				  putstring1("Save Phone Ok,Number is:\r\n");
			      sprintf(TPA,"++");
				  strcat(TPA, ptr);
				  putstring1(TPA);
			      putstring1("\r\n");
			      
				  sprintf(TP_UD,"OK");

				  return 1;                //gsmSendMessage("OK"); 
				      
			    }
			    else
                {      
				  putstring1("Save Phone Fail!");
			      sprintf(TP_UD,"Fail");   //gsmSendMessage("Fail"); 
         	      return 0;	
				  
		        }



		    }//if((ptr=strstr(task,"B")) != NULL)
          }//if(gsmSearchPhone("A"))
        }//if(task[0] == 'B')


        return 0;
}


// PDU编码,用于编制、发送短消息 
// pSrc: 源PDU参数指针 
// pDst: 目标PDU串指针 
// 返回: 目标PDU串长度 
int gsmEncodePdu(char xdata* pDst)   //pDst=pdu;
{     
    int nLength;             // 内部用的串长度     
    int nDstLength;          // 目标PDU串长度     
   
	// SMSC地址信息段     
    nLength = strlen(SCA);       // SMSC地址字符串的长度         

	if((nLength & 0x01)==0)
        nDstLength= nLength/2+1;
    else
        nDstLength= (nLength+1)/2 + 1;

	ans[0] = (char)nDstLength;  // SMSC地址信息长度  
	ans[1] = 0x91;        // 固定: 用国际格式号码     
    nDstLength = gsmBytes2String(ans, pDst, 2);           // 转换2个字节到目标PDU串     

    nDstLength += gsmInvertNumbers(SCA, &pDst[nDstLength], nLength);    // 转换SMSC到目标PDU串   
	// TPDU段基本参数、目标地址等     
	nLength = strlen(TPA);         // TP-DA地址字符串的长度     
	ans[0] = 0x11;                 // 是发送短信(TP-MTI=01),TP-VP用相对格式(TP-VPF=10)     
	ans[1] = 0;                    // TP-MR=0     
	ans[2] = (char)nLength;        // 目标地址数字个数(TP-DA地址字符串真实长度)     
	ans[3] = 0x91;                 // 固定: 用国际格式号码     
	nDstLength += gsmBytes2String(ans, &pDst[nDstLength], 4);  // 转换4个字节到目标PDU串     
	nDstLength += gsmInvertNumbers(TPA, &pDst[nDstLength], nLength); // 转换TP-DA到目标PDU串          

	// TPDU段协议标识、编码方式、用户信息等     
	nLength = strlen(TP_UD);       // 用户信息字符串的长度     
	ans[0] = TP_PID;               // 协议标识(TP-PID)     
	ans[1] = TP_DCS;               // 用户信息编码方式(TP-DCS)     
	ans[2] = 0;                    // 有效期(TP-VP)为5分钟  

	
	if(TP_DCS == GSM_7BIT)         
	{         
		// 7-bit编码方式         
		ans[3] = nLength;                                                // 编码前长度         
		nLength = gsmEncode7bit(TP_UD, &ans[4], nLength+1) + 4;    // 转换TP-DA到目标PDU串     
	}     
	else 
	if(TP_DCS == GSM_UCS2)     
	{         
	   #if 0
	   // UCS2编码方式         
		ans[3] = gsmEncodeUcs2(pSrc->TP_UD, &ans[4], nLength);    // 转换TP-DA到目标PDU串         
		nLength = ans[3] + 4;        // nLength等于该段数据长度     
	   #endif
	}     
	else     
	{         
		// 8-bit编码方式         
		//ans[3] = gsmEncode8bit(TP_UD, &ans[4], nLength);      // 转换TP-DA到目标PDU串         
		nLength = ans[3] + 4;                                       // nLength等于该段数据长度     
	}     

	nDstLength += gsmBytes2String(ans, &pDst[nDstLength], nLength); // 转换该段数据到目标PDU串          
	// 返回目标字符串长度     
	return nDstLength; 

⌨️ 快捷键说明

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