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

📄 gprs.cpp

📁 GPRS开发原码,英创386的GPRS控制函数
💻 CPP
字号:
#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       10

struct ActionItem
{
   char* ATCmdString;
   char* ATEchoString;
   int   (* DoRoutine)();
   long  TimeOut;
};

char  	       GATCmdStr[40];
char  	       GATEchoStr[40];
unsigned long  GTimeOut;
unsigned long  StartTick;
char           ReturnStr[2560];
int            Returnlen=0;
int            EchoStrlen;
int            InPro = 0;
int            FirstFlg = 0;
PPPGPRSState   State=POWERON;

int   GPRSPowerOn( );
int   PPPInit( );
int   SendATCmd( );
int   PPPLinkUp( );
int   PPPPolling( );
int   PPPTermNet( );
int   GPRSPowerIsOn( );
int   EnableIGT( );
int   DisableIGT( );

struct ActionItem  ActionList[ListNum] =
{ { 0,				       0,	  GPRSPowerOn,  200 },
  { 0,  			       0,	  PPPInit,      0   },
  { "ATE0\r",  			       "OK",	  SendATCmd,    40  },
  { "AT+CGATT?\r", 		       "1", 	  SendATCmd,    40  },
  { "AT+CGATT=1\r", 		       "OK", 	  SendATCmd,    100 },
  { "AT+CGDCONT=1,\"IP\",\"CMNET\"\r", "OK", 	  SendATCmd,    40  },
  { "ATD*99***1#\r", 		       "CONNECT", SendATCmd,    40  },
  {  0,				       0,	  PPPLinkUp,    200 },
  {  0,         		       0,	  PPPPolling,   0   },
  {  0,         		       0,	  PPPTermNet,   220 } };

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;

   if( GTimeOut == 0 ) return 0;

   // for vrtx, replace with sc_gettime( );
   CurrentTick = NB_clock( );
   if( CurrentTick >= (StartTick+GTimeOut) )  return 1;
   else                                       return 0;
}

int   GPRSPowerOn( )
{
   int i;
   switch( InPro )
      {
      case 0:
	   if( !GPRSPowerIsOn( ) )
	      {
	      DisableIGT( );
	      NB_Delay( 10 );
	      EnableIGT( );
	      NB_Delay( 100 );
	      DisableIGT( );
	      StartTick = NB_clock( );
	      InPro = 1;
	      }
	   break;
      case 1:
	   if( IsTimeOut( ) )
	      InPro = 0;
	   break;
      }

   return InPro;
}

int  PPPInit( )
{
   int i;

   InPro = 0;
   i = InitPPPNet( );
   if( i < 0 )   return -1;
   return 0;
}

int  SendATCmd( )
{
   int  i1;
   char abyte;

   switch( InPro )
      {
      case 0:
	   SendATCmdString( GATCmdStr );
	   EchoStrlen = strlen( GATEchoStr );
	   StartTick = NB_clock( );
	   InPro = 1;
	   Returnlen = 0;
	   break;
      case 1:
	   i1 = GetATCmdEcho( );
	   if( i1 != -1 )
	      {
	      abyte = (char)i1;
	      if( abyte == '\r' )      ReturnStr[Returnlen] = 'r';
	      else if( abyte == '\n' ) ReturnStr[Returnlen] = 'n';
	      else                     ReturnStr[Returnlen] = abyte;
	      Returnlen++;
	      ReturnStr[Returnlen] = '\0';
	      if( Returnlen >= EchoStrlen )
		if( strncmpi( &ReturnStr[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 = NB_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 = NB_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;

   i = 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:
	   if( i1==0 )   State = PPPINIT;
	   break;
      case PPPINIT:
	   if( i1==0 )   State = ATE0;
	   else          State = POWERON;
	   break;
      case ATE0:
	   if( i1==0 )         State = ATCGATT;
	   else if( i1<0 )     State = PPPTERM;
	   break;
      case ATCGATT:
	   if( i1==0 )         State = ATCGDCONT;
	   else if( i1<0 )     State = ATCGATT_1;
	   break;
      case ATCGATT_1:
	   if( i1==0 )         { State = ATCGATT; FirstFlg=0; }
	   else if( i1<0 )
	     {
	     FirstFlg++;
	     if( FirstFlg>1 )   { State = PPPTERM; FirstFlg=0; }
	     }
	   break;
      case ATCGDCONT:
	   if( i1==0 )         State = ATD99;
	   else if( i1<0 )     State = PPPTERM;
	   break;
      case ATD99:
	   if( i1==0 )
	      {
	      State = PPPLINKUP;
	      FirstFlg = 0;
	      }
	   else if( i1<0 )
	      {
	      FirstFlg++;
	      if( FirstFlg>1 )     {FirstFlg=0; State = PPPTERM;}
	      }
	   break;
      case PPPLINKUP:
	   if( i1==0 )         State = PPPPOLLING;
	   else if( i1<0 )     State = PPPTERM;
	   break;
      case PPPPOLLING:
	   if( i1==-1 )        State = PPPTERM;
	   break;
      case PPPTERM:
	   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 + -