📄 gprs.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 + -