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

📄 main.c

📁 单片机通过控制SIM300C 短信模块读GPS 数据
💻 C
📖 第 1 页 / 共 2 页
字号:
		for(i=0;i<Len;i++)
		putch(Info->SMS_text[i]);			//英文短信内容.	
	
		putch(0x0d);
		putch(0x0a);

//比较短信密码是否正确
		for(i=0;i<15;i++)
		{
			j =byte_verify(0x2E00 +i);
			if(j==0) break;					//比较完成
			putch(j);						//旧密码打印
			if(Info->SMS_text[i]!=j)		//密码错
			{
/*
			 	putch('P');
				putch('e');
				putch('r');
				putch('r');
				putch(0x0d);
				putch(0x0a);			
*/				
				goto	reportPass;
			}

		}
//密码正确
	putch('P');
	putch('a');
	putch('s');
	putch('s');
	putch(0X30 +i);
	putch(0x0d);
	putch(0x0a);		
//---判断命令
	Pt =cmp(&Info->SMS_text[0],"Owner");
	if(Pt==0xff)	goto SetPsw;		
//是设定接收短信的手机.
	{
		for(i=Pt+5;i<100;i++)
		{
		j =Info->SMS_text[i];
		if(j==0) break;
		putch(j);				//把Owner后面的数据打印出来
		}

//把当前手机号更换为管理手机.


		sector_erase(0x2E00);					//把旧数据擦除
//1,先更新密码	
		for(i=0;i<Pt;i++)
		{
		 j =Info->SMS_text[i];	
		 byte_program((0x2E00+i),j);		
		}
    	byte_program((0x2E00+i),0);				//密码结束符


//2 更新手机号
//		putch('M');
		for(i=0;i<20;i++)
		{
		 j =Info->TelNum[i];
//		 	putch(j);
		 byte_program((0x2E00+15+i),j);				
		 if(j==0) break;
		}	

//3 更新称呼		
		for(i=0;i<20;i++)
		{
		j =Info->SMS_text[Pt+5+i];
		byte_program((0x2E00+40 +i),j);				//手机后面的无效字符.
		if(j==0) break;	
		}
//4 读出前60个数据,产生BCC.
		Len = 0;
		for(i=0;i<60;i++)
		{
			Len +=byte_verify(0x2E00 +i);
		}		
		byte_program((0x2E00+60),Len);			//写上BCC
		byte_program((0x2E00+61),0X55);	
		byte_program((0x2E00+62),0X66);	

//先回复一条短信:
		sendSMS(Info->TelNum,"Hello! Owner.");
		
//把短信删除	


		goto InfoEnd;
	}

///===============以上为更改管理手机号
SetPsw:
		Pt =cmp(&Info->SMS_text[0],"Password");	
		if(Pt==0xff)		goto  GetSms;	
		{							
//把旧密码及手机号读出,再更改密码
			for(i=0;i<60;i++)
				pData[150+i] =byte_verify(0x2E00+i);
			for(i=0;i<15;i++)
				{
				j=Info->SMS_text[Pt+8+i]; 
				pData[150+i]=j;				
				if(j==0) break;
				}			

//把旧信息删除
			sector_erase(0x2E00);
//编程新密码到EEPROM
			for(i=0;i<60;i++)
			{
			byte_program((0x2E00+i),pData[150+i]);	
			}	
			
			Len = 0;
			for(i=0;i<60;i++)
			{
				Len +=byte_verify(0x2E00 +i);
			}		
			byte_program((0x2E00+60),Len);			//写上BCC
			byte_program((0x2E00+61),0X55);	
			byte_program((0x2E00+62),0X66);					

			sendSMS(Info->TelNum,"Pls keep you new password safely.");	//短信报告,密码更改成功
		goto InfoEnd;
		}

GetSms:
		Pt =cmp(&Info->SMS_text[0],"Get Message");		
		if(Pt==0xff)		goto  reportPass;
		{
//把EEPROM中的GPS数据发送给手机,如果无数据,发送无.
			if((byte_verify(0x2800+121)==0x55) && (byte_verify(0x2800+122)==0x66))		//GPS数据有效.  
			{
					Len =byte_verify(0x2800+120);	//GPS数据
					for(i=0;i<Len-2;i++)
					{
						pData[150+i] =byte_verify(0x2800+i);
					}
					pData[150+i] =0;
					sendSMS(&Info->TelNum[0],&pData[150]);

			}
			else		//无GPS数据
			{
				sendSMS(&Info->TelNum[0],"Not GPS Data !");
			}
			goto InfoEnd;
		}

reportPass:
		Pt =cmp(&Info->SMS_text[0],"wei cheng jie");		//如果信息为wei cheng jie
															//把密码送出
		if(Pt==0xff) goto	InfoEnd;
		{
			memcpy(&pData[150],"Password is ",12);
			for(i=0;i<20;i++)			
			{
			pData[162+i] =byte_verify(0x2E00+i);
			if(pData[162+i]==0) break;
			}		
			sendSMS(&Info->TelNum[0],&pData[150]);							
		}


//信息处理结束
InfoEnd:
	deleSMS(Info->Index);
	putch('d');
	putch('e');
	putch('l');
	putch(0x0d);
	putch(0x0a);

 	}
NoMobil:
	putch('E');
	putch('n');
	putch('d');
	putch(0x0d);
	putch(0x0a);

			delay=0;
			memset(pData,0,256);
			RxCount=0;		
			Delay100mS(1);	 
			RxFlag=0;
			REN = 1;
		
		}

	   if(RxFlag)
	   {	
//GPS数据保存在0X2400开始.	      							  			
	putch('G');
	putch('P');
	putch('S');
	putch(0x0d);
	putch(0x0a);

	   		for(i=0;i<RxCount;i++)
			{				
				if(byte_verify(0x2800+i)!=pData[i])		//当前读到的GPS数据与上次数据不一至.
					{
				  	sector_erase(0x2800);					//把旧数据擦除
				  	for(j=0;j<RxCount;j++)
						{
						byte_program(0x2800+j,pData[j]);	//把新的GPS数据写到IAP上.	
						}

				  	byte_program(0x2800+120,RxCount);	//GPS数据长度.
					byte_program(0x2800+121,0x55);		//GPS数据有效.
					byte_program(0x2800+122,0x66);		//GPS数据有效.  				
					pData[RxCount-2] = 0;

				    for(i=0;i<20;i++)
					{
						pData[150+i] =byte_verify(0x2E00+15+i);
						if(	pData[150+i]==0) break;
					}
		    	   if(sendSMS(&pData[150],pData)==0) 		//GPS数据变化,发送短信
					{
						delay = 100000;
						while(delay--);
                        SendAT("ATD13800138000;",ACK_OK,pData+150);	
						delay = 1000L;
						while(delay--);
 						SendAT("ATH;",ACK_OK,pData+150);	
						delay = 100000L;
						while(delay--);

					}

				  	break;				
					}
						
			}					 
		 
	   		RxFlag=0;
	   }

	}

}

#ifdef DEBUG_SMS
void putch(byte ch)
{
  byte i;
  i = ch;

  ES = 0;
  TI=0;
  SBUF =ch;
  while(!TI);
  TI = 0;
  ES = 1;	  
}
#endif

//接收GPS模块数据.
void Com_Int(void) interrupt 4	using 1				// com interrupt routin
{

	RecTimeOut=120;								// byte timeout==20ms
	if(RI==1)									// recieved interrupt
	{
	   
		RI=0;	
		if(!RxFlag)
		{
			if(RecStatus==0)
			{			    
                 if(SBUF=='$')
				 {
					RxCount=1;
					pData[0]='$';
					RecStatus=1;
				  }         

			}
			else
			{

						if(RxCount>=120){RxCount=0;	RecStatus=0;return;}
						RxCount++;
						pData[RxCount-1]=SBUF;					                   
               			if(pData[RxCount-1]==0X0A && pData[RxCount-2]==0X0D)
                 		{	  				  								
										//接收到GPS一个完整的数据包
							if(pData[3]=='R' && pData[4]=='M')		//徐工说只读这个数据就行了.
							RxFlag=1;
				  			RecStatus=0;
						
				 		}               	         
			}
		}		
	}

}


//发送一条短消息
//接收短信的手机,
//发送短信的英文内容

bit sendSMS(byte *telnum, byte  *STRING)
  {

	idata int i,ch,tmp,Len1;
	idata byte Buff[10];
	idata byte A_LEN[4],S_LEN[3];
	byte  len, tim ;     

	len = strlen (STRING);
	
	len = len <<1; 		//数据长度 * 2
	Len1 = 0;
	Len1 = len +15;
	
//--- 总消息长度为10进制,的ASCII 码 
	sprintf (A_LEN, "%d\n", Len1);
	for(i=0;i<4;i++)
	{
	 if(A_LEN[i]==0x0A) A_LEN[i] = 0;
	 }


//--- 消息长度为16进制,的ASCII 码   
	tim = 0x30+((len & 0xF0 ) >> 4);
	if(tim < 0x30 || tim > 0x39) tim  +=0x7;
	S_LEN[0] = tim;
	
	tim = 0x30+ (len & 0x0F );
	if(tim < 0x30 || tim > 0x39) tim  +=0x7;
	S_LEN[1] = tim;
	S_LEN[2] = 0;
	
	tim =10;
 while(tim)
   {  
    tim -=1;      
	putch('S');
    send_str("AT+CMGS=");  //  19\r"); 
    send_str(A_LEN);
    send_str("\r");

	if(getAck(4,Buff)) 
	{
		delay=500000l;
		while(delay--);
		continue;
	 }

 	putch(Buff[0]); 
	putch(Buff[1]); 
	putch(Buff[2]); 
	putch(Buff[3]); 

   if ( Buff[2]=='>') 
      { 	  
               		
	    send_str("0891683108200005F01100");		//0D9168");	  //头
              
        send_str(telnum);      // 接收短信息的手机
      
		send_str("0008A7");
		send_str(S_LEN); //("04"); //(hex)               // 信息长度。+ 15 为总长度                  
	
		i = 0;
		while(1)			
		{
	 	ch =STRING[i];
	 	if(ch==0) break;
	 	PSendChar(0x30);
	 	PSendChar(0x30);			
	 	tmp = 0x30+((ch & 0xF0 ) >> 4);
     	if(tmp < 0x30 || tmp > 0x39) tmp  +=0x7;
	 	PSendChar(tmp);

	 	tmp = 0x30+(ch & 0x0F ) ;
     	if(tmp < 0x30 || tmp > 0x39) tmp  +=0x7;
	 	PSendChar(tmp);
	 	i++;		 
		}            
		PSendChar(26);		    		             	
		BT_REC = 1;
        delay=5000000L;
    	while(delay--)
		{		
			if(BT_REC==0)
			{
				ch =PGetChar();						
			    if(ch=='K') return(0);   //发送成功			
			}	 		
		}
		
       }
       	
 }   
 
 return(1);   // 发送失败
 }


// 取N个字节.
bit getAck(byte Len,byte *getData)
{
  byte i;
  unsigned long m;
	m = 500000;
	i = 0;
	while(m--)
	{	
	  if(BT_REC==0)
	  {
	  	getData[i] =PGetChar();	
		BT_REC=1;
		m = 50000;
		i+=1;
		if(i==Len) return(0);		
	  }	 

	}
	return(1);
}	

/*
byte sendSMS(byte *telnum, byte  *STRING)
  {
   bit OK =0 ;
   idata int i,Len1;
   idata byte A_LEN[4],S_LEN[3];
   byte  len, tim,STATUS1;  
   
   byte idata TelNum[14];

   TelNum[0] =telnum[1];
   TelNum[1] =telnum[0];

 	TelNum[2] =telnum[3];
   	TelNum[3] =telnum[2];
 	TelNum[4] =telnum[5];
   	TelNum[5] =telnum[4];
 	TelNum[6] =telnum[7];
   	TelNum[7] =telnum[6];
 	TelNum[8] =telnum[9];
   	TelNum[9] =telnum[8];
 	TelNum[10] ='F';
   	TelNum[11] =telnum[10];
 	TelNum[12] =0;

   len = strlen (STRING);
    
   len = len /2; 
   Len1 = 0;
   Len1 = len +15;
   
//--- 总消息长度为10进制,的ASCII 码 
   sprintf (A_LEN, "%d\n", Len1);
   for(i=0;i<4;i++)
    {
	 if(A_LEN[i]==0x0A) A_LEN[i] = 0;
	 }




//--- 消息长度为16进制,的ASCII 码   
   tim = 0x30+((len & 0xF0 ) >> 4);
   if(tim < 0x30 || tim > 0x39) tim  +=0x7;
   S_LEN[0] = tim;

   tim = 0x30+ (len & 0x0F );
   if(tim < 0x30 || tim > 0x39) tim  +=0x7;
   S_LEN[1] = tim;

   S_LEN[2] = 0;


   tim =10;
   while(tim)
   {  
    tim -=1;
    Recv_ok =0;
    memset (ComBuffer , '\0', 250); 
    RecvCnt = 0; 

    send_str("AT+CMGS=");  //  19\r"); 
    send_str(A_LEN);
    send_str("\r");

    P2_1 = ~ P2_1;
    stop_data ();    
    
    STATUS1=cmp(ComBuffer,">");

     if (STATUS1!=0xff) 
          {  
		  	Recv_ok =0;
            memset (ComBuffer , '\0', sizeof (RecvCnt)); 
            RecvCnt = 0; 					  
 
		    send_str("0891683108200005F011000D9168");	  //头
                  
            send_str(TelNum);      // 接收短信息的手机
          
			send_str("0008A7");
			send_str(S_LEN); //("04"); //(hex)               // 信息长度。+ 15 为总长度                  
			send_str(STRING);                
            ES=0;
			SBUF=26;
		    while(TI==0);
            TI=0;
			ES=1;          
     	  		     
 			delay1 = 10000;		   
			delay2 = 200;

            while(delay1)
			 {  
              STATUS1=cmp(ComBuffer,"OK");			 
                 if (STATUS1!=0xff) 
			         { tim =0;
					   OK = 1;					  
					   break;
					 }

     		  STATUS1=cmp(ComBuffer,"ERROR");			 
                if (STATUS1!=0xff) 
          	    {; break;	}

               delay2 --;
			   if (delay2==0)
			     { delay2 = 100; delay1-=1 ; }                
             
			  }

           }       
      else
	 { ;	}
	
 }   

    Recv_ok =0;
    memset (ComBuffer , '\0', sizeof (RecvCnt)); 
    RecvCnt = 0; 
 
  if(OK) return(0);       // 发送成功
  else   return(0xFF);    // 发送失败
 }
*/    


/*	
//推荐最小明确数据: 纬度,经度,速度
$GPRMC,000000.000,V,0000.0000,S,00000.0000,W,0.00,0.00,220899,,,A*7E
UTC 时间
纬度,
经度
速度
高度
日,月,年
*/



// 7-bit编码
// pSrc: 源字符串指针
// pDst: 目标编码串指针
// nSrcLength: 源字符串长度
// 返回: 目标编码串长度
/*
unsigned char gsmEncode7bit(char* pSrc, unsigned char* pDst, unsigned char nSrcLength)
{
    unsigned char nSrc;        // 源字符串的计数值
    unsigned char nDst;        // 目标编码串的计数值
    unsigned char nChar;       // 当前正在处理的组内字符字节的序号,范围是0-7
    unsigned char 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;
            // 修改目标串的指针和计

⌨️ 快捷键说明

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