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

📄 nemain.c

📁 典型的NOKIA短信猫程序,控制NOKIA615061105110等序列手机收发短信.
💻 C
📖 第 1 页 / 共 4 页
字号:
	  {
	     if(g_Send.AckPtr>0)
	        {  //正在发送ACK
		   if(g_Send.AckPtr<SENDACKLEN)
		      {			
			   TXBUF0=g_Send.Ack[g_Send.AckPtr];
			   g_Send.AckPtr++;
		      }
		   else
		      {
			   g_Send.AckPtr=0;
			   if(g_Send.BufLen>0)
			     {
				//启动发送g_SendBuf缓冲
				TXBUF0=g_Send.Buf[0];
				g_Send.BufPtr++;
			     }					
		      }			
		
		}
	}	   
 }

interrupt[UART0RX_VECTOR] void usart0_rx (void)//OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO
 {
	static uchar Len,RecPtr,SumH,SumL,RecState=RECWAIT;
	uchar dat;	
	dat=RXBUF0;
	switch(RecState)
	  {
		case RECWAIT:
			if(dat==0x1e)
			    RecState=RECDST;					
			break;
		case RECDST:
			if(dat==0xc)
			    RecState=RECSRC;					
			else
			    RecState=RECWAIT;
			break;
		case RECSRC:
			if(dat==0x0)
			    RecState=RECCMD;
			else
			    RecState=RECWAIT;
			break;	
		case RECCMD:			
			g_RecCmd=dat;
			RecState=RECLENH;										
			break;
		case RECLENH://大于256byte则返回初始态begin ver sum 
			if(dat==0)
			  {
				RecState=RECLENL;
				SumH=0x1e;
			  }
			else
				RecState=RECWAIT;
			break;
		case RECLENL:
			Len=dat;
			RecState=RECDATA;
			SumL=0x0c^g_RecCmd^Len;
			RecPtr=0;
			break;
		case RECDATA:
			if(RecPtr<RECBUFLEN)	
			   g_RecBuf[RecPtr]=dat;//若超出缓冲则忽略
			if((RecPtr&0x01)==0)
				SumH^=dat;
			else
				SumL^=dat;
			RecPtr++;
			if(RecPtr>=Len)
			   {
				if(long_b==1)//收到SEQ
				    g_Send.Ack[7]=dat;
				else
				    g_Send.Ack[7]=dat - 0x40;					
				//g_RecLen为奇数则补1					
				if((Len&0x01)==1)
					RecState=RECPAT;
				else
				        RecState=RECSUMH;			
			   }
			break;
		case RECPAT:
			if(dat==0)
				RecState=RECSUMH;
			else
				RecState=RECWAIT;
			break;
		case RECSUMH:
			if(dat==SumH) 
			  {
				RecState=RECSUML;
			        g_Send.Ack[6]=g_RecCmd;
				g_Send.Ack[8]=0x1e^0x0c^g_RecCmd;
				g_Send.Ack[9]=0x7f^0x02^g_Send.Ack[7];
			  }
			else 
			     RecState=RECWAIT;
			break;
		case RECSUML:
			if(dat==SumL)
			   {					
				//send ack;
				if(g_RecCmd!=0x7f)
				   {    //收到的不是ACK,则发ACK
					if(g_Send.BufPtr==0)
					   {    //g_SendBuf[]不在发送
						TXBUF0=g_Send.Ack[0];
						g_Send.AckPtr=1;
					   }			
					else
						g_Send.AckPtr=0xff;//待发送
				   }
				//rec end		
				DispatchMes();
				
			   } 
			RecState=RECWAIT;
			break;
		default:
			RecState=RECWAIT;
	}						  	
 } 
 
void DispatchMes(void)//解释手机讯息,国际通用的格式
 {
	uchar i;
	
	switch(g_RecCmd)
	   {		
		case 02://sms handle
		  if(long_b==1)
                    {		
		        long_b=0;
		        if (zwr==0x00)	 //english
		          for(i=0;i<(g_RecSmgLong-g_RecSmgLong/8-78);i++) 
		              g_RecSmg[i+78]=g_RecBuf[i];
		        else             //chinese
		          for(i=0;i<(g_RecSmgLong-78);i++) 
		              g_RecSmg[i+78]=g_RecBuf[i];
		        g_flag|=RECSMG;
		    }
		  if(g_RecBuf[0]==0x1&&g_RecBuf[1]==0x08&&g_RecBuf[2]==0x00)
		    {
			if(g_RecBuf[3]==0x10)
			   {	//receive a smg
                                P5OUT |= 0x02;   
				g_SmgNoIn=g_RecBuf[24];
				//give smg to a buf	
				if(g_RecBuf[23]&0x01)
				   {//even
					for(i=0;i<g_RecBuf[23]/2+1;i++)//取出对方号码
					    outnum[i+1]=g_RecBuf[i+25];
				   }
				else
				   {
				        for(i=0;i<g_RecBuf[23]/2;i++)//取出对方号码
					    outnum[i+1]=g_RecBuf[i+25];
				   }
				outnum[0]=g_RecBuf[23];
				zwr=g_RecBuf[21];
				g_RecSmgLong=g_RecBuf[22];//短信息的长度每个包最大能收到89个字节英文OR 数字
				if(zwr==0x00)
				   {//英文
                                           if(g_RecSmgLong>89)//每个包只能收89个字节
                                              long_b=1;
                                           else
                                              g_flag|=RECSMG;			
                                           for(i=0;(i<(g_RecSmgLong-g_RecSmgLong/8))&&(i<78);i++)
                                             g_RecSmg[i]=g_RecBuf[i+42];                                                    
                                   }
                                else
                                   {//chinese
                                           if(g_RecSmgLong>78)//每个包只能收78个字节 
                                              long_b=1;
                                           else
                                             g_flag|=RECSMG;			
                                           for(i=0;(i<g_RecSmgLong)&&(i<78);i++)
                                              g_RecSmg[i]=g_RecBuf[i+42];                                                    
                                   }                                       						
				
			   }
			else if(g_RecBuf[3]==0x02)/////////////////////////////////////////////
			   g_flag|=SMSSENDOK;
			else if(g_RecBuf[3]==0x03)
			   g_flag|=SMSSENDFA;
			else
			  {
			      if(g_RecBuf[3]==0x34)
			        {		
				    g_flag|=RECSMGCEN;
				    //save smg center	
				    g_SmgCenLen=g_RecBuf[21];
				    g_CenNoIn=g_RecBuf[22];
				    for(i=0;i<g_SmgCenLen;i++)
				        g_SmgCen[i]=g_RecBuf[i+22];						
			        }
			  }	  
                    }
		  break;		
		case 04://phone status
		  if(g_RecBuf[0]==0x1&&g_RecBuf[1]==0x08&&g_RecBuf[2]==0x00)
		     {
			if(g_RecBuf[3]==0x4&&g_RecBuf[4]==0x1)
			   {
				g_flag|=RECPHONEID;
				for(i=0;i<15;i++) 
				   g_DialBuf[i]=g_RecBuf[i+5];
			   }
			else
                           {			  
			      if(g_RecBuf[3]==0x02)//场强不为零,工作正常
			        {  
                                    if( !(g_flag & QUERYTIME) )
			                g_flag_2|=LEVEL;
			            g_flag &= ~QUERYTIME;    
                                    if( g_RecBuf[5] > 0 )
                                        P5OUT |= 0x01;
                                    else if( (g_RecBuf[5] == 0) && (P_LEVEL == 0) )
                                        P5OUT &= ~0x01;
                                    P_LEVEL=g_RecBuf[5];
                                }			          
			   }       
		     }					
		  break;
		case 0x14:
		  if(long_b == 1)
                    {		
		        long_b = 0;
		        if( zwr == 0x00 )	 //english
		        {
		            for(i=0;i<(g_RecSmgLong-g_RecSmgLong/8-77);i++) 
		                g_RecSmg[i+77]=g_RecBuf[i];
		        }
		        else             //chinese
		        {
		            for(i=0;i<(g_RecSmgLong-77);i++) 
		                g_RecSmg[i+77]=g_RecBuf[i];
		        }
		        g_flag|=RECSMG;
		    } 			
                  
                    if( (g_RecBuf[0]==0x1) && (g_RecBuf[1]==0x08) && (g_RecBuf[2]==0x00) )
                    {	
                            if( g_RecBuf[3] == 0x08 )
                            {
                                    P5OUT |= 0x02;   
                                    DelNo = g_RecBuf[6];        // 短信存储位置
                                    g_flag_2 |= DELSIMSMS;  
                                    
                                    if(g_RecBuf[22] == 0x08)	
                                        zwr = 0x08;	//unicode
                                    else	
                                        zwr = 0x00;//英文
                                    
                                    g_SmgNoIn=g_RecBuf[25];

                                    if(g_RecBuf[24]&0x01)
                                    {//even
                                      for(i=0;i<g_RecBuf[24]/2+1;i++)//取出对方号码
                                            outnum[i+1]=g_RecBuf[i+26];
                                    }
                                    else
                                    {
                                        for(i=0;i<g_RecBuf[24]/2;i++)//取出对方号码
                                            outnum[i+1]=g_RecBuf[i+26];
                                    }
                                    outnum[0]=g_RecBuf[24];
                                    
                                    g_RecSmgLong=g_RecBuf[23];
                                    
                                    if(zwr==0x00)
                                    {//英文
                                        for(i=0;(i<(g_RecSmgLong-g_RecSmgLong/8))&&(i<77);i++)
                                            g_RecSmg[i]=g_RecBuf[i+43];
                                        if( g_RecSmgLong > 88 )
                                            long_b = 1;
                                        else                                                            
                                            g_flag |= RECSMG;		
                                    }
                                    else
                                    {//chinese
                                        for(i=0;(i<g_RecSmgLong)&&(i<77);i++)
                                            g_RecSmg[i]=g_RecBuf[i+43];                                                    
                                        if( g_RecSmgLong > 77 )
                                            long_b = 1;
                                        else                                                            
                                            g_flag |= RECSMG;		
                                    } 
                                                                          
                            }
                            else if( g_RecBuf[3] == 0x09 )
                            {
                                g_flag_2 |= HAVESMS;
                               // g_flag_2 &= ~DELSIMSMS;      
                            }
                            else if( g_RecBuf[3] == 0x37 )
                            {
                                if( g_RecBuf[10] > 0 )
                                {
                                    g_flag_2 |= HAVESMS;
                                }
                                else
                                {
                                    ReadNo=1;
                                    DelSMS_Time = 200;
                                    g_flag_2 |= FIRSTDEL;
                                    g_flag_2 |= HAVENOSMS;
                                }
                            }
                            else if( g_RecBuf[3] == 0x0B )
                                g_flag_2 |= DELSMSOK;
                    }
                  break;
		case 0x40:
		  g_flag|=LACOK;
		  break;
		case 0x01:			//call information
		  if(g_RecBuf[0]==0x01&&g_RecBuf[1]==0x08&&g_RecBuf[2]==0x00)
		     {//01 08 00 g_RecBuf[4]is callseq
			if(g_RecBuf[3]==0x03&&g_RecBuf[5]==0x05&&g_RecBuf[6]==0x00&&g_RecBuf[7]==0x01&&g_RecBuf[8]==0x03&&g_RecBuf[9]==0x02&&g_RecBuf[10]==0x91)
			   //establihed voice call	03 callseqnr 05 00 01 03 02 91 00 
			   g_flag|=CALLOK;//呼叫成功
			else if(g_RecBuf[3]==0x05&&g_RecBuf[5]==0x05)
			   {					
				 g_flag|=CALLCOME;//有呼叫
		                 g_RecPhoneNo[0]=g_RecBuf[6];//号码长度
				 for(i=1;i<=g_RecBuf[6];i++)
				   {
					if(i>=RECPHONELEN) 
					   break;
					g_RecPhoneNo[i]=(g_RecBuf[i+6]);		 
			           } 		 	
			   }	
			else
			  {
			      if(g_RecBuf[3]==0x04)
			          g_flag|=REMOTEEND;//遇忙,对方挂机
		          }
		     }				
		  break;
		case 0x64:
  		  TXBUF1=g_RecBuf[6];
		  while ((UTCTL1&0x01)==0);
             	  break;
		case 0x7f:
		  g_AckCmd=g_RecBuf[0];// cmd
		  g_AckSeq=g_RecBuf[1];// seq
		  g_flag|=RECACK;
		  break;
		case 0x0c://keys
		  if(g_RecBuf[0]==0x1&&g_RecBuf[1]==0x08&&g_RecBuf[2]==0x00)
		     {
			//1E 0C 00 0C 00 07 01 08 00 43 02 01 41 00 5C 4D 
			if(g_RecBuf[3]==0x43&&g_RecBuf[0x04]==0x1)
			   g_flag_2|=KEYPRESS;	
			//1E 0C 00 0C 00 07 01 08 00 43 01 01 42 00 5C 4D 
			if(g_RecBuf[3]==0x43&&g_RecBuf[0x04]==0x2)
			   g_flag_2|=KEYRELEASE;					
		     }
		  break;
	        case 06://ussd handle
		  //1E 0C 00 06 00 19 E4 B2 DC 5C 67 83 AE 6F 39 9B AC 80 B9 90 65 36 5C A1 72 15 F1 69 
                  //3A 01 02 00 41 70
		  if(long_b==2)
                    {		
		        long_b=0;
		        for(i=0;i<(g_RecUSSDLen-112);i++) 
		            g_RecUSSD[i+112]=g_RecBuf[i];
		        g_flag_2|=USSDMENU;
		    }
		  if(g_RecBuf[0]==0x1&&g_RecBuf[1]==0x08&&g_RecBuf[2]==0x00)
		    {
			//1E 0C 00 06 00 7A 01 08 00 05 00 0F 01 87 31 D7 94 FE 1E AF 41 50 79 7A 5C 56 C8 5C 
			//53 FA 7B BC 06 05 DD 61 76 7E 9E 9E 2B 66 AE 61 9A 9E 07 B1 D3 E6 B2 82 E6 62 BE E9 
			//F4 B2 3C AF A8 B9 98 69 7B DA 7D 06 21 C3 6E B2 F8 FD 5E 2B 6C 2E 63 78 8E 4E BF DD 
			//20 76 DA 5C 56 DC 5C 45 37 BD 2C A7 87 D3 EE 76 D9 4D 57 E0 5C D0 BA 98 9D 1E 83 92 
			//6E F3 5B DE 0E D3 D3 6F B7 22 E7 BA BE DD 02 41 EA D5 
                        
			if((g_RecBuf[3]==0x05)&&(g_RecBuf[6]==0x01))
			   {	
				g_RecUSSDLen=g_RecBuf[7];
				if(g_RecUSSDLen>112)//每个包只能收89个字节
                                     long_b=2;
                                else
                                     g_flag_2|=USSDMENU;			
                                for(i=0;(i<g_RecUSSDLen)&&(i<112);i++)
                                     g_RecUSSD[i]=g_RecBuf[i+8];                                                    
			   }
			//1E 0C 00  06   00 0D  01 08 00   05   00 0F    02  03  CF 65 08    01   46 00 9C 62
			else if((g_RecBuf[3]==0x05)&&(g_RecBuf[6]==0x02))
			  {  
			        g_RecUSSDLen=g_RecBuf[7];
				for(i=0;i<g_RecUSSDLen;i++)
			            g_RecUSSD[i]=g_RecBuf[i+8];
			        g_flag_2|=USSDOK;
			  }
			//1E 0C 00  06   00 08  01 08 00    03   01 06    01 43 1F 4C 
			else if((g_RecBuf[3]==0x03)&&(g_RecBuf[5]==0x06))
			      g_flag_2|=UNKNOWN;    
		        else
			  {   //1E 0C 00  06   00 09   01 08 00   03  01 02 22 01    40 00 7C 0B
			      if((g_RecBuf[3]==0x03)&&(g_RecBuf[5]==0x02))
			          g_flag_2|=USSDFA;			
                          }
                    }
                  break;
           }    
 }
 
interrupt[UART1TX_VECTOR] void usart1_tx (void)
 {
 }

interrupt[UART1RX_VECTOR] void usart1_rx (void)
 {
    RxCls=0;
    if((RxTimeLong==0)&&(RXBUF1==0x08))
      hz_bz=0x08;
    RXsmg[RxTimeLong]=RXBUF1;
    RxTimeLong++; //读入的长度
    if((RXBUF1==0XFD)&&(RxTimeLong<3))
        RxTimeLong=0;
    if(RXBUF1==CLSR[CLSR_1])
        CLSR_1++;

⌨️ 快捷键说明

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