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

📄 gprs.cpp

📁 湖北水文黄石试点集中器代码
💻 CPP
字号:
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* Copyright (C), 2005, TopBond Tech. Co., Ltd.
* File name:       GPRS.CPP
* Module name:     GPRS自动拨号上网模块
* Author/Date:     WuHuan  06/02/14 
* Version:         Ver 1.0
* Description:     GPRS自动拨号上网系列函数的.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 "gprs.h"
#include "etr232i.h"
#include "etr_ppp.h"

#define  ListNum       11    //定义ActionList[ ]数组的长度

struct ActionItem
{
   char* ATCmdString;        //存储AT指令字符串的指针
   char* ATEchoString;       //接受AT正确响应字符串的指针
   int   (* DoRoutine)();    //函数的指针
   long  TimeOut;            //函数运行超时的变量
};

char  	       GATCmdStr[40];         //存储AT指令字符串的数组     
char  	       GATEchoStr[40];        //存储AT正确响应字符串的数组  
unsigned long  GTimeOut;              //存储超时的门限值
unsigned long  StartTick;             //计时的起点
char  far      ReturnStr_GPRS[2560];  //存储接受到的AT响应字符串的数组
int            Returnlen = 0;         //返回的AT响应字符串的长度
int            EchoStrlen;            //正确的AT响应字符串的长度
int            InPro = 0;             //状态机分步处理的标志
int            ErrFlg = 0;            //错误的标志
PPPGPRSState   State = POWERON;       //GPRS状态的标志


struct ActionItem  ActionList[ListNum] =
{ { 0,				       0,	  GPRSPowerOn,  200 },
  { 0,  			       0,	  PPPInit,      0   },
  { "ATE0\r",  			       "OKrn",	  SendATCmd,    40  },
  { "AT+CGATT?\r", 		       "1", 	  SendATCmd,    40  },
  { "AT+CGATT=1\r", 		       "OKrn", 	  SendATCmd,    200 },
  { "AT+CGDCONT=1,\"IP\",\"CMNET\"\r", "OKrn", 	  SendATCmd,    40  },
  { "ATD*99***1#\r", 		       "CONNECT", SendATCmd,    100  }, /*---change 40 to 100 by wuhuan 06.02.15---*/
  {  0,				       0,	  PPPLinkUp,    200 },
  {  0,         		       0,	  PPPPolling,   0   },
  {  0,         		       0,	  PPPTermNet,   200 } };  /*---change 600 to 200 by wuhuan 06.07.26---*/

int  EnableIGT( )
{
    GPRS_AUX( 0 );
    GPRS_STB( 1 );
    return 0;
}

int  DisableIGT( )
{
    GPRS_STB( 0 );
    return 0;
}

int GPRSPowerIsOn( )
{
   unsigned char status;

  // check GPRS module power state
  status = GPRS_PWR( );
  return status;
}

// return = 1: time out, =0: not yet!
int IsTimeOut( )
{
   unsigned long    CurrentTick;

   //ReloadWDT( );  //加载Watchdog( )函数
   if( GTimeOut == 0 ) return 0;

   CurrentTick = clock( );
   if( CurrentTick >= (StartTick+GTimeOut) )  return 1;
   else                                       return 0;
}

int   GPRSPowerOn( )
{
   int i;
   unsigned long  CurrentTick;
   
   switch( InPro )
   {
      case 0:
	         if( !GPRSPowerIsOn( ) )
	         {
	             DisableIGT( );
	             StartTick = clock( );
	             InPro = 1;
	         }
	         break;
	    
	    case 1:
	    	   CurrentTick = clock( );
	    	   if( CurrentTick >= (StartTick + 1) ) 
	    	   {  	   
	            if(!GPRSPowerIsOn( ))  
	            {
	            	 EnableIGT( );	            	 
	            	 StartTick = clock( );
	            	 InPro = 2;
	            }
	           	else InPro = 0;
	         }
	         break;	    	    
	    	    
	    case 2:
	    	   CurrentTick = clock( );
	    	   if( CurrentTick >= (StartTick + 2) ) 
	    	   { 	    	
	            if(!GPRSPowerIsOn( )) 
	            {
	            	 DisableIGT( );
	            	 StartTick = clock( );
	            	 InPro = 3;
	            }
	         	  else InPro = 0;
	         }
	    	   break;	  	   
	    
      case 3:
	         if( IsTimeOut( ) )
	         InPro = 0;
	         break;
	    
   }

   return InPro;
}

int  PPPInit( )
{
   int i;

   InPro = 0;
   i = InitPPPNet( );
   
   //把WatchDog定时器的加载函数传给网络运行库,使之能在网络函数运行期间及时加载WatchDog
   SetReloadWDTInNet( (void(*)())ReloadWDT );

   if( i < 0 )   return -1;
   return 0;
}

int  SendATCmd( )
{
   int  i1;
   char abyte;  

   switch( InPro )
   {
      case 0:
	         SendATCmdString( GATCmdStr );
	         EchoStrlen = strlen( GATEchoStr );
	         StartTick = clock( );
	         InPro = 1;
	         Returnlen = 0;
	   break;
	   
     case 1:
	        i1 = GetATCmdEcho( );
	        if( i1 != -1 )
	        {
	            abyte = (char)i1;
	            if( abyte == '\r' )      ReturnStr_GPRS[Returnlen] = 'r';
	            else if( abyte == '\n' ) ReturnStr_GPRS[Returnlen] = 'n';
	            else                     ReturnStr_GPRS[Returnlen] = abyte;
	            Returnlen++;
	            ReturnStr_GPRS[Returnlen] = '\0';
	            if( Returnlen >= EchoStrlen )
		          if( strncmpi( &ReturnStr_GPRS[Returnlen-EchoStrlen], GATEchoStr, EchoStrlen )==0 )
		          {
		              InPro = 0;
		              return 0;
		          }
		          
	            if( Returnlen >= 2560)
		          {
		              InPro = 0;
		              return -1;
		          }
	        }
	         
	        if( IsTimeOut( ) )
	        {
	            InPro = 0;
	            return -1;
	        }
	    break;
	    
   }

   return InPro;
}

int   PPPLinkUp( )
{
   int i;

   switch( InPro )
      {
      case 0:
	   i = SetupPPPLink( 0 );
	   StartTick = clock( );
	   InPro = 1;
	   break;
	   
      case 1:
	   i = SetupPPPLink( 0 );
	   if( i==0 )
	      {
	      InPro = 0;
	      return 0;
	      }
	   if( IsTimeOut( ) )
	      {
	      InPro = 0;
	      return -1;
	      }
	   break;
      }

   return InPro;
}

int   PPPPolling( )
{
   InPro = 0;
   if( !GPRSPowerIsOn( ) )   return -1;
   if( GetPPPState( ) !=1 )  return -1;
   return 0;
}

int   PPPTermNet( )
{
   switch( InPro )
   {
      case 0:
	         TermPPPNet( );
	         StartTick = clock( );
	         GPRS_AUX( 1 );
	         InPro = 1;
	         break;
	         
      case 1:
	         if( GPRSPowerIsOn( ) )  GPRS_AUX( 1 );
	         else	                   InPro = 0;
	         	
	         if( IsTimeOut( ) )  InPro = 0;
	         break;
   }

   return InPro;
}

// return 0 1:  PPPInit
// return 7:  SetupPPPLink
// return 8:  PPPLinkup
// return 9:  PPPTerm
// other( 2 3 4 5 6 ):  ATCmd
PPPGPRSState  PPP_Running( )
{
    int i, i1;
    
	  static unsigned long  PPPStartTick = 0;
 
   i = State;
  
   
    if(clock()<=PPPStartTick  )
   	{
   				return State;
    }
  
      if( ActionList[i].ATCmdString != NULL )
      {
        strcpy( GATCmdStr, ActionList[i].ATCmdString );
        strcpy( GATEchoStr, ActionList[i].ATEchoString );
      }
      GTimeOut = ActionList[i].TimeOut;
      i1 = ActionList[i].DoRoutine( );
  
  

   switch( State )
   {
      case POWERON:     //0
	         if( i1==0 )   State = PPPINIT;
	         break;
	         
      case PPPINIT:    //1
	         if( i1==0 )   State = ATE0;
	         else          State = POWERON;
	         break;
	         
      case ATE0:   //2
	         if( i1==0 )         State = ATCGATT;
	         else if( i1<0 )     State = PPPTERM;
	         break;
	         
      case ATCGATT:  //3
	         if( i1==0 )
	         {
	             State = ATCGDCONT;
	             //NB_Delay( 20 );
	             //PPPStartTick = 50;
	          }
	         else if( i1<0 )
	         State = ATCGATT_1;
	         break;
	         
      case ATCGATT_1:   //4
	         if( i1==0 )
	         {
	            State = ATCGATT;
	            ErrFlg=0;
	         }
	         else if( i1<0 )
	         {
	            ErrFlg++;
	            if( ErrFlg>1 )   { State = PPPTERM; ErrFlg=0; }   /*---change 3 to 1 by wuhuan 06.03.23---*/
	         }             
	         break;
	         
      case ATCGDCONT:  //5
	         if( i1==0 )
	         {
	             //NB_Delay(200);
	             PPPStartTick =clock()+4;
	          
	             State = ATD99;
	         }
	         else if( i1<0 )     State = PPPTERM;
	         break;
	         
      case ATD99:   //6
	         if( i1==0 )
	         {
	             State = PPPLINK;
	             ErrFlg = 0;
	         }
	         else if( i1<0 )
	         {
	             ErrFlg++;
	             if( ErrFlg>1 )     {ErrFlg=0; State = PPPTERM;}  /*---change 3 to 1 by wuhuan 06.03.23---*/
	         }
	         break;
	         
      case PPPLINK:  //7
      	   PPPStartTick = clock()+2;
	         if( i1==0 )         State = PPPLINKUP;
	         else if( i1<0 )     State = PPPTERM;
	         break;
	         
      case PPPLINKUP:   //8
      	   PPPStartTick =clock()+1;
	         if( i1==-1 )        State = PPPTERM;
	         break;
	         
      case PPPTERM:   //9
	         PPPStartTick = clock()+2;
	         if( i1==0 )         State = POWERON;
	         break;
    }

   return State;
}

void PPP_Restart( )
{
   if( State < ATE0 )    return;
   InPro = 0;
   State = PPPTERM;
}

⌨️ 快捷键说明

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