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

📄 m32.c

📁 这是用W77E58编写的控制GSM模块
💻 C
📖 第 1 页 / 共 4 页
字号:
#include <w77e58.h>
#include "global.h"
#include "io.h"
#include "timer.h"
#include "serial.h"
#include "m32.h"



extern bit  GPSReady;
bit  AlarmFlag;

extern bit   GPSav;           //1 = A
bit GPSTimerReq;
extern UINT16   idata   GPSTimer30;

#define _1_SEC         35
#define _2_SEC         70
#define _5_SEC         150
#define _10_SEC        300
#define _30_SEC        900



//用户信息编码方式 
#define GSM_7BIT        0 
#define GSM_8BIT        4 
#define GSM_UCS2        8      



char xdata SCA[16];                  // 短消息服务中心号码(SMSC地址)     
char xdata TPA[16];                  // 目标号码或回复号码(TP-DA或TP-RA) 
char xdata TP_PID;                   // 用户信息协议标识(TP-PID)     
char xdata TP_DCS;                   // 用户信息编码方式(TP-DCS)     
char xdata TP_SCTS[16];              // 服务时间戳字符串(TP_SCTS), 接收时用到     
char xdata TP_UD[161];               // 原始用户信息(编码前或解码后的TP-UD)     
int xdata  index;                   // 短消息序号,在读取时用到 
int xdata  PhoneNumber;              //存电话号码用



char xdata cmd[16];                       // 命令串     
char xdata pdu[256];                      // PDU串     
char xdata ans[256];                      // 应答串     

char idata gsm_task;
//int  aLength;
extern uchar     idata  SysTimer;
extern uchar     xdata  JWDMode;
extern UINT32    xdata  Speed;
extern UINT32    xdata  LonDeg,LonMin1,LonMin2,LatDeg,LatMin1,LatMin2;
extern UINT32	 xdata  xYear,xMonth,xDay;
extern UINT32	 xdata  xHour,xMin,xSec;


int gsmSearchPhone(uchar* flag);  

int gsmString2Bytes(uchar* pSrc, uchar* pDst, int nSrcLength); 
int gsmEncodePdu(char xdata* pDst);   //pDst=pdu;
//void gsmGreateSmsHD(void);           //SMS header

 
void ClearBuf(uchar* Buff,int size)
{
         int xdata i;
		 for(i=0;i<size;i++)
		 {
            
		   Buff[i]=0;
		 }

}



void ATSend(uchar* puts)
{
     
      for (;*puts!=0;puts++)   //遇到停止符0结束
      {
	      putbyte(*puts);
          getUartWait();
	      //getbyte();
		  //putbyte1(getbyte());
 		
	  }
      ClearBuf(ans,256);             
         
}


void gsmInitPhoneBook(void)
{

        ATSend("AT+CPBS=\"SM\"\r");  //SIM 卡作为电话簿存储体。
        PhoneNumber = 1;
        

}



#if 1
BOOL gsmSavePhone(uchar* phone,uchar* flag)
{

       int xdata n;
       uchar xdata* ptr;
       ClearBuf(ans,256);  
       sprintf(ans,"AT+CPBW=");
     
     #if 1  
       sprintf(cmd,"%d",PhoneNumber);
	   strcat(ans,cmd);
     #endif  
       
       strcat(ans,",\"");
       strcat(ans,phone);
       strcat(ans,"\",129,\"");
       strcat(ans,flag);
       strcat(ans,"\"\r");
       putstring1(ans);
	   putstring1("\r\n");
	   
       ATSend(ans); 
       
	   ReadSerail(ans, 128, &n,5);  
       if((ptr=strstr(ans,"+CME ERROR:"))== NULL)
       {
       
	       return TRUE;        
	   }
       else
       {
           return FALSE;
       }


}
#endif


#if 1
BOOL gsmDeletePhone(int index)
{
      int xdata i,n;      
	  sprintf(cmd,"AT+CPBW=");
      sprintf(ans,"%d",index);
	  strcat(cmd,ans);
      strcat(cmd,"\r\n");
     
	  ATSend(cmd);
   	  ReadSerail(ans, 120, &n,5);  
   	  if((strstr(ans,"OK")) != NULL) return TRUE;
	  return FALSE; 

}
#endif

#if 1
int gsmSearchPhone(uchar* flag)  
{
    
       int xdata n;
       uchar xdata* ptr;
       ClearBuf(ans,256);  
       sprintf(ans,"AT+CPBF=\"");
       strcat(ans, flag);                      
	   strcat(ans,"\"\r\n");
       ATSend(ans); 
       ReadSerail(ans, 256, &n,5);  
       if((ptr=strstr(ans,"+CPBF: ")) != NULL)
	   {
           //putstring1(ptr);
           //putstring1("\r\n");
           ptr +=6;
		   sscanf(ptr, "%d", &n);
             
       	   return n;        

	   }
       else
	   {
		  return 0;
       }
}
#endif


uchar* gsmCheckRightNumber(uchar* text,BOOL phone)       //phone=1,get phone number to SCA;else cmp SCA and TPA.
{
       int xdata i,n;
       uchar xdata Number[16];
       uchar xdata * ptr;
       
	   sprintf(ans,"AT+CPBF=\"");
       strcat(ans, text);                      
	   strcat(ans,"\"\r\n");
       strcpy(cmd,ans);
	   putstring1("cmd:\r\n"); 
	   putstring1(cmd); 
	   putstring1("\r\n"); 
	   i=5;
	   while(i--)
	   {
	   
	      ATSend(cmd); 
          ReadSerail(ans, 256, &n,5);  
          if((ptr=strstr(ans,"+CPBF: ")) != NULL) break;
	      else
          if(strstr(ans,"RING") != NULL) return 0;;

       } 
	  
	   if(i==0)return 0;
	   
	   while(1)
       {    
           ATSend(cmd); 
           ReadSerail(ans, 256, &n,5);  
	       putstring1("ans=:\r\n"); 
	       putstring1(ans); 
	       putstring1("\r\n"); 
           if((ptr=strstr(ans,"+CPBF: ")) != NULL)
	       {   
		      ptr +=6; //skip [+CPBF ]
		      if((ptr=strstr(ptr,",\"")) != NULL)
		      {
   	             if(strncpy(Number,ptr,16) != NULL)  
                 {
                     for(i=0;i<16;i++)
                    {
                      if((Number[i]=='\"') && (Number[i+1]==','))   
				      {
					      Number[i]=0;    //第二个"后面清0;
            			  
						  Number[0]=TPA[0];
                          Number[1]=TPA[1];
								
						  putstring1("Number=:\r\n"); 
			              putstring1(Number); 
				          putstring1("\r\n"); 
		                    	
						  putstring1("TPA=:\r\n"); 
			              putstring1(TPA); 
				          putstring1("\r\n"); 
			              if(phone==1)return Number;               
						  if(strncmp(Number,TPA,strlen(TPA))==0)
                          {
                              //is right number,go on next. 
					          return Number; 
              
			              }
                          return NULL;    			  
					  }
				   }//for(i=0;i<16;i++)
			       
				 }//if(strncpy(SCA,ptr,16) != NULL)      
	           
		      }//if((ptr=strstr(ptr,",\"")) != NULL)
              else
			  return NULL;
		   }//if((ptr=strstr(ans,"+CPBF: ")) != NULL)
	       else
		   return NULL;
	  } //while(1)
      
}




#if 1
int gsmGetRightNumber(uchar* text)
{
     uchar xdata* ptr;
	 
	 if((ptr=gsmCheckRightNumber(text,1))==NULL) return 0;
	 strcpy(TPA,ptr);
 
     
	 putstring1("You have Right Name is:\r\n");
     putstring1(text);
     putstring1("\r\n");
     putstring1("You have Right Number is:\r\n");
     putstring1(TPA);
     putstring1("\r\n");
     return 1;              
	   
}
#endif





BOOL gsmSendMessage(void) 
{     
	int  xdata nPduLength;                           // PDU串长度     
	unsigned char  xdata nSmscLength;                // SMSC串长度     
	int   xdata nLength;                             // 串口收到的数据长度     
    uchar xdata* ptr;     
   
	TPA[0]=SCA[0];
    TPA[1]=SCA[1];


    putstring1("Send Message Start:\r\n");
    putstring1("SCA=:\r\n");
    putstring1(SCA);
    putstring1("\r\n");
   	putstring1("TPA=:\r\n");
    putstring1(TPA);
    putstring1("\r\n");
         
   
	nPduLength = gsmEncodePdu(pdu);           // 根据PDU参数,编码PDU串 
	strcat(pdu, "\x01a");                     // 以Ctrl-Z结束          
	gsmString2Bytes(pdu, &nSmscLength, 2);    // 取PDU串中的SMSC信息长度     
	nSmscLength++;                            // 加上长度字节本身    
	                                          // 命令中的长度,不包括SMSC信息长度,以数据字节计     
	sprintf(cmd, "AT+CMGS=%d\r", nPduLength/2 - nSmscLength);    // 生成命令          
   
	while(1)
	{
	   ATSend(cmd);
       ReadSerail(ans, 128, &nLength,5);
       if((ptr=strstr(ans,"\r\n> ")) != NULL)
	   {
           
            ATSend(pdu);  // 得到肯定回答,继续输出PDU串
           	ReadSerail(ans, 128, &nLength,5);
    	    if((strstr(ans, "+CMGS: ")) == NULL)
			{
		           putbyte('\r');
		           delay_ms(20);
			       putstring1("SMSC Send Ok!\r\n"); 
				   
				   return 1;
    	    }
		    else
			{
                    putstring1("SMSC ANSWER:Err\r\n"); 
			        putstring1(ans); 
			        putstring1("\r\n"); 
			
					
					putbyte('\r');
		           	delay_ms(20);
	                ATSend("AT\r\n");
                    delay_ms(200);


			}
	   }
	   else
       {
           putstring1("NO ANSWER:\r\n"); 
		   putstring1(ans); 
		   putstring1("\r\n"); 
		   
	       if((strstr(ans,"RING")) != NULL) return FALSE;
           putbyte('\r');
           delay_ms(20);
	       ATSend("AT\r\n");
           delay_ms(200);
	      
	   }    
	 }
	  
}      







//List all phonebook entries:
// AT+CPBF="DA"







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


// 字节数据转换为可打印字符串 // 如:{0xC8, 0x32, 0x9B, 0xFD, 0x0E, 0x01} --> "C8329BFD0E01"  
 // pSrc: 源数据指针 
 // pDst: 目标字符串指针 
 // nSrcLength: 源数据长度 
 // 返回: 目标字符串长度 
 int gsmBytes2String(uchar xdata * pSrc, char xdata* pDst, int nSrcLength) 

⌨️ 快捷键说明

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