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

📄 sms.cpp

📁 湖北水文黄石试点集中器代码
💻 CPP
📖 第 1 页 / 共 2 页
字号:
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* Copyright (C), 2005, TopBond Tech. Co., Ltd.
* File name:       SMS.CPP
* Module name:     收发短信低层函数的模块
* Author/Date:     WuHuan  06/02/14 
* Version:         Ver 1.0
* Description:     收发短信低层系列函数的.CPP文件
* Others:          如有改动,请在下面的历史记录登记,谢谢合作!

------------------History-----------------------------
* Modifier/Date:    //修订人及修订日期
* Modify Reason:    //修订原因
* Modification:     //修订的内容和位置的简要说明
------------------------------------------------------
* Modifier/Date:    //修订人及修订日期
* Modify Reason:    //修订原因
* Modification:     //修订的内容和位置的简要说明
------------------------------------------------------
 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
#include <stdio.h>
#include <stdlib.h>
#include <dos.h>
#include <time.h>
#include <string.h>
#include <math.h>
#include "sms.h"
//#include "gprs.h"       //add by wuhuan 06.03.24
#include "wdt.h"        //add by wuhuan 06.03.24
#include "etr232i.h"
#include "rs232x3.h"
#include "keymenu.h"

#define  retries       5        //# A counter for the number of retries

/***************************************************************************/
//下列声明的函数为短信的编解码函数,如若对短信的编解码不熟悉,请勿改动以下函数

int   ConvertUDStr( char* InStr, char* OutStr );
void  ConvertPhoneNumber( char* InStr, char* OutStr );
int   GetRcvMSG( char* Str );     //读取短信的内容
void  ToPhoneNumber( char* InStr, char* OutStr );
void  ToTime( char* InStr, char* OutStr );
int   Bit8ToStr( char* InStr, char* OutStr );
int   Bit16ToStr( char* InStr, char* OutStr );
int   GetMSGList( struct RcvSMSInfo* Info ); //检查SIM卡中未读短信的条数

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

//全局数组,改动前请查看它们在各个函数中的位置及其作用
unsigned char far  str1[20], str2[200], str[200];

/*************************************************************** 
  SMSRingFlg = 0: SMS state; =1: Ring state;在MAIN.CPP中定义;
   让ETR232I模块在接收短信和检查震铃两种状态间切换
***************************************************************/
extern int  SMSRingFlg ;  
///////////////////////////////////    
//存储AT指令响应的字符串或返回的短信字符
char far ReturnStr[2560];
int Check_Returnlen=0;
unsigned long  StartTickNum;

int SEND( char* cmdstr )  //通过COM2口发AT指令
{
   int i, len;
   len = strlen( cmdstr );
   for( i=0; i<len; i++ )
      PutOutputData( SMSCOM, cmdstr[i] );
   StartSend( SMSCOM );
   StartTickNum = clock( );
   return i;
}

int RcvIsTimeOut( long NumTick )
{
   unsigned long    CurrentTick;
  
   if( NumTick == 0 ) return 0;

   CurrentTick = clock( );
   if( CurrentTick >= (StartTickNum + NumTick))  return 1;
   else return 0;
}
	  
int CHECK( long TimeOutNum, char* EchoStr )
{
       int  i, i1, EchoStrlen;  
       char abyte;  
   
       EchoStrlen = strlen( EchoStr ); 
       
   	   i1 = GetInputData( SMSCOM );       
       if( i1 != -1 )       
       {
       	   abyte = (char)i1;
           if( abyte == '\r' )      ReturnStr[Check_Returnlen] = 'r';
           else if( abyte == '\n' ) ReturnStr[Check_Returnlen] = 'n';
           else                     ReturnStr[Check_Returnlen] = abyte;
           Check_Returnlen++;
           ReturnStr[Check_Returnlen] = '\0';
           if( Check_Returnlen >= EchoStrlen )  
           if( strncmpi( &ReturnStr[Check_Returnlen - EchoStrlen], EchoStr, EchoStrlen )==0 )  
           {   
           	   Check_Returnlen = 0;
       	       return 0;  //AT响应正确
           }
          
           if( Check_Returnlen >= 2560 )  {  Check_Returnlen = 0; return -1;  }
           
       }
       if( RcvIsTimeOut(TimeOutNum) )  {  Check_Returnlen = 0; return -1;  }  
         	      
   return 1;    //正在接收AT响应的字符串
   
}


int ReceiveSMS( char* Content, int Index )
{
   int    i,i1 ;
   static ReceiveSMS_State  State_of_ReceiveSMS = ReceiveSMS_START; // 定义描述ReceiveSMS()函数状态的全局变量

   switch( State_of_ReceiveSMS )
   {
   	   case ReceiveSMS_START:
   	   	    SEND( "ATE0\r" );
   	   	    State_of_ReceiveSMS = ReceiveSMS_ATE0_Get;
   	   	    break;
   	   	    
   	   case ReceiveSMS_ATE0_Get:
   	   	    i = CHECK( 2,"OKrn" );
   	   	    if( i==0 ) 
   	   	    {     	   	    	
   	   	    	 SMSRingFlg = 1; 
   	   	    	 State_of_ReceiveSMS = ReceiveSMS_ATCMGF_SEND;
   	   	    }
   	   	    else if(i<0)
   	   	    {  
   	   	    	  SMSRingFlg = 1;
   	   	    	  State_of_ReceiveSMS = ReceiveSMS_Idle;
   	   	    	  StartTickNum = clock( );
   	   	    }
   	   	    break;   	   	    

   	   case ReceiveSMS_ATCMGF_SEND:
   	   	    SEND( "AT+CMGF=0\r" );
   	   	    State_of_ReceiveSMS = ReceiveSMS_ATCMGF_GET;
   	   	    break;   	   	
   	   	       	   	    
   	   case ReceiveSMS_ATCMGF_GET:
   	   	    i = CHECK( 2,"OKrn" );
   	   	    if( i==0 ) 
   	   	    {    
   	   	    	  SMSRingFlg = 1;  	   	    	  
                State_of_ReceiveSMS = ReceiveSMS_ATCMGR_SEND;
            } 
            else if(i<0)
            {   
            	  SMSRingFlg = 1;
            	  State_of_ReceiveSMS = ReceiveSMS_Idle;
            	  StartTickNum = clock( );
            } 	   	    	  
   	   	    break;   
   	   	    	 
   	   case ReceiveSMS_ATCMGR_SEND:      	   		   	       	   	       	   	     
   	   	    sprintf( str1, "AT+CMGR=%d\r", Index );
            SEND( str1 );
            State_of_ReceiveSMS = ReceiveSMS_ATCMGR_GET;               	   	    	  
   	   	    break;       	
   	   	       	   	       	   	       	   	       	   	       	   	       	   	       	   	       	   	      	   	       	   	       	   	       	   	       	   	                   
       case ReceiveSMS_ATCMGR_GET:       	  
       	    i = CHECK( 20,"OKrn" );       	         	           	           	    
       	    if( i==0 ) 
       	    {    
       	    	  SMSRingFlg = 1;  
       	    	  i1 = GetRcvMSG( Content );
       	    	  if(GetKPState==LOCK) printf(" i1 = %d\n",i1);       	    	
       	        sprintf( str1, "AT+CMGD=%d\r", Index );
                SEND( str1 );             
                State_of_ReceiveSMS = ReceiveSMS_START;
            	  return i1;                      //返回实际接受到短信内容的字节数
               
            }
            else if(i<0) 
            {  
            	  SMSRingFlg = 1;
            	  State_of_ReceiveSMS = ReceiveSMS_Idle; 
            	  StartTickNum = clock( );	 
            }
            break; 	
             
       case ReceiveSMS_Idle:
            if( RcvIsTimeOut(20) )  State_of_ReceiveSMS = ReceiveSMS_START;
            break;
              
   }  
/////////////////////////////////////////////////////////////////////*/    
   return 0;
   
}
       	    
       	    
              	   	      	   	     	   	
//extern GTimeOut;
int CheckSMS( struct RcvSMSInfo* Info )
{
   int       i, i1;
   static CheckSMS_State     State_of_CheckSMS = CheckSMS_START; // 定义描述CheckSMS()函数状态的全局变量
   static  int  num = retries;
   
   switch(State_of_CheckSMS)
   {
	    case CheckSMS_START:
           num--;
           if( num < 0) 
           {
           	  State_of_CheckSMS = CheckSMS_Idle; 
           	  StartTickNum = clock( );
           }
		       else State_of_CheckSMS = CheckSMS_ATE0_SEND;
		       if(GetKPState==LOCK) printf("step0 running\n");
		       break;

	    case CheckSMS_ATE0_SEND:
		       SEND( "ATE0\r" );
		       State_of_CheckSMS = CheckSMS_ATE0_Get;
		       if(GetKPState==LOCK) printf("step1 running\n");
		       break;
		       
	    case CheckSMS_ATE0_Get:
           i = CHECK( 80,"OKrn" );
           if(i==0)
           {  
           	  num = retries;
           	  SMSRingFlg = 1; 
           	  State_of_CheckSMS = CheckSMS_ATCMGF_SEND;
           }
           else if(i<0 )  
           {  
           	  if(GetKPState==LOCK) printf("step2 timeout\n");
           	  //NB_Delay( 1000 ); 
           	  SMSRingFlg = 1;          	
           	  State_of_CheckSMS = CheckSMS_Idle;
           	  StartTickNum = clock( );
           }
  	       if(GetKPState==LOCK) printf("step2 running\n");
           break;
      
      case CheckSMS_ATCMGF_SEND:
      	   SEND( "AT+CMGF=0\r" );
  	       State_of_CheckSMS = CheckSMS_ATCMGF_GET;
  	       if(GetKPState==LOCK) printf("step3 running\n");
  	       break;
      	          
      case CheckSMS_ATCMGF_GET:
  	       i = CHECK( 80,"OKrn" );
  	       if(i==0)  
  	       {  
  	       	  SMSRingFlg = 1;  	       	  
  	          State_of_CheckSMS = CheckSMS_ATCMGL4_SEND ;
  	       }
  	       else if(i<0 )  
  	       {  
  	       	  SMSRingFlg = 1; 
  	       	  State_of_CheckSMS = CheckSMS_Idle; 
  	       	  if(GetKPState==LOCK) printf("step4 timeout\n");
  	       	  StartTickNum = clock( );
  	       }
  	       if(GetKPState==LOCK) printf("step4 running\n");
           break;
           
      case CheckSMS_ATCMGL4_SEND:
           SEND( "AT+CMGL=0\r" );      //显示所有未读的短信   
  	       State_of_CheckSMS = CheckSMS_ATCMGL4_GET ; 	
  	       //if(GetKPState==LOCK) printf("step5 running\n");      
           break;
             
      case CheckSMS_ATCMGL4_GET :
  	       i = CHECK( 120,"OKrn" );   //change 80 to 120  by wuhuan 06.03.24
  	       if( i==0 )
           {  
           	   SMSRingFlg = 1;  
               i1 = GetMSGList( Info );              
               //if(GetKPState==LOCK) printf("GetMSGList=%d\n",i1);
               //NB_Delay( 1000 );
               State_of_CheckSMS = CheckSMS_ATCMGL4_SEND;
               return i1;              //返回值>0:接收到短信
           }
           else if(i<0 )  
           {             	 
           	   if(GetKPState==LOCK) printf("step6 timeout\n"); 
           	   //NB_Delay( 1000 );
           	   SMSRingFlg = 1; 
           	   State_of_CheckSMS = CheckSMS_Idle; 
           	   StartTickNum = clock( );
           }
          // if(GetKPState==LOCK) printf("step6 running\n");            
           break;  

⌨️ 快捷键说明

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