#include "gprs_funcdef.h"
#include "gprs_vardef.h"
#include "myfunclib.h"
#include "string.h"
bit Init_Flag=0;
//--------测试用ip地址和端口号-----------------------------
extern BYTE xdata IP_ADDRESS1;
extern BYTE xdata IP_ADDRESS2;
extern BYTE xdata IP_ADDRESS3;
extern BYTE xdata IP_ADDRESS4;
extern BYTE xdata PORT1;
extern BYTE xdata PORT2;
extern WORD xdata Send_timer;
//----------------------------------------------------------
BYTE xdata WAVE_Receive_Num = 0; //GPRS串口接收到的数据记数
BYTE xdata RECEIVEBUFFER[100];
void load_ip_port()
{
// 装入IP地址
IP_Head[16]=IP_ADDRESS1;
IP_Head[17]=IP_ADDRESS2;
IP_Head[18]=IP_ADDRESS3;
IP_Head[19]=IP_ADDRESS4;
//装入端口号
UDP_Head[2]=PORT1;
UDP_Head[3]=PORT2;
}
//***************************************************
//WAVECOM 数据接收子程序:串口0中断服务程序
//**************************************************
void Serial0_WAVECOM(void) interrupt 4
{
if(exitData || enterPhone)
{
if (RI)
{
RI = 0;
URAT0Revbuffer[URAT0writeBuffer++] = SBUF;
}
if(TI)
{
TI = 0;
if(URAT0SWriteBuffer != URAT0SWreadBuffer)
{
SBUF = URAT0SendBuffer[URAT0SWreadBuffer++];
}
else
{
URAT0SWriteBuffer = URAT0SWreadBuffer = 0;
sendOver = 1;
}
}
}//GPRS mode.
else
{
if (RI)
{
RI=0;
if(RECEIVE_FLAG==0)
{
if(SBUF==0x7E)
{
RECEIVE_FLAG=1;
RECEIVEBUFFERPOINT=RECEIVEBUFFER;
WAVE_Receive_Num = 0;
}
}
else
{
if(SBUF==0x7E)
{
RECEIVE_FLAG=0;
if(RECEIVEBUFFERPOINT!=RECEIVEBUFFER) //排除连续收到两个7E,数据长度为0的错误情况
{
PPP_Rec_Complete = 1;
}
}
else
{
if(PADDING_Flag==1)
{
*RECEIVEBUFFERPOINT=SBUF;
if((*RECEIVEBUFFERPOINT) == 0x5E)
{
*RECEIVEBUFFERPOINT = 0x7E;
}
else if((*RECEIVEBUFFERPOINT) == 0x5D)
{
*RECEIVEBUFFERPOINT = 0x7D;
}
else
{
*RECEIVEBUFFERPOINT^=0x20;
}
PADDING_Flag=0;
RECEIVEBUFFERPOINT++;
WAVE_Receive_Num++;
}
else
{
if(SBUF==0x7D)
PADDING_Flag=1;
else
{
*RECEIVEBUFFERPOINT=SBUF;
RECEIVEBUFFERPOINT++;
WAVE_Receive_Num++;
}
}
}
}
}
}
}
/////////////////////////////////////////////////////////////
//timer 0 interrupt
////////////////////////////////////////////////////////////
void ISR_Timer0(void) interrupt 1
{
TH0=0;
TL0=0;
if(Timer0_Counter<10){ //256 //Wait 1000us 20*50us
Timer0_Counter++;
}
else{
Timer0_Counter = 0;
if(waitTimer)
waitTimer--;
if(Link_Timer) //if Link_Timer==0 but net not ok,connect again
{
Link_Timer--;
}
if(Send_timer)
{
Send_timer--;
}
}
}
////////////////////////////////////////////////////////////////////
//联网从此函数开始
//该函数执行的条件,是没有联网和联网超时
////////////////////////////////////////////////////////////////////
void InitAndConnect(void)
{
unsigned char xdata csq;
if(!GPRS_OK && Link_Timer == 0) //如果没有联网而且联网时间已超时,则开始重新联网
{
ES=1;
csq = 99;
while(csq > 31) //读取信号强度
{
csq = GetCSQ();
}
if(csq != 00)
{
exitData = 0;
TestAndConnect(); //拨号去联网
}
}
}
void TestAndConnect()
{
UINT i;
ES=1; //允许串�断
ATD99(); //拨号连接GPRS网络 ATD*99***1#
Link_Timer = 60000; //设置连接超时时间 time is 2 minutes
for(i=0;i<10;i++) Delay10ms();
}
////////////////////////////////////////////////////////////
//拨号连接GPRS网络子程序
////////////////////////////////////////////////////////////
void ATD99()
{
BYTE i;
for(i=0;i<12;i++) /* ATD*99***1# */
{
// WDTCN = 0xa5;
SBUF = GSMCommand2[i];
while(TI==0); TI=0;
}
}
BYTE GetCSQ(void)
{
BYTE xdata fStart = 0,fEnd = 0,csq = 0,netValue = 0;
BYTE data i;
static BYTE xdata csqCount = 0;
exitData = 1;
URAT0writeBuffer=URAT0readBuffer=0;
URAT0SWriteBuffer = URAT0SWreadBuffer = 0;
SendDatagToPhone("AT+CSQ\x0d",7);
Delay10ms();
Delay10ms();
waitTimer = 2;
while(waitTimer)
{
if(((URAT0writeBuffer - URAT0readBuffer)&0xff) >= 4) // len of "AT+CLCC\XD\X0X\X0AOK\X0D\X0A" is 14;
{
if(mymemcmp(URAT0Revbuffer,URAT0readBuffer,"\x0d\x0aOK",4)==0)
{
for(i = 0; i <= 12 ; i++)
{
if(URAT0Revbuffer[URAT0readBuffer - i] == ':')
{
//csq---取信号强度
csq = (URAT0Revbuffer[URAT0readBuffer - i + 2] - 0x30) * 10 + URAT0Revbuffer[URAT0readBuffer - i + 3] - 0x30;
netValue = URAT0Revbuffer[URAT0readBuffer - i + 5]; //取信号误码率
if(netValue <= '6' && csqCount++ >= 3) //信号误码率小于6且保持3次以上
{
csqCount = 0;
return csq;
}
else if(netValue == '7') //电话打入
{
return 00;
}
else
return 99;
}
}
}
else if(mymemcmp(URAT0Revbuffer,URAT0readBuffer,"ERRO",4)==0)
{
URAT0writeBuffer = URAT0readBuffer = 0;
return 255;
}
else
{
URAT0readBuffer++;
}
}
}
URAT0writeBuffer=URAT0readBuffer=0;
URAT0SWriteBuffer = URAT0SWreadBuffer = 0;
return 255;
}
//********************************************************************
//PPP连接时交互语句
//********************************************************************/
// 发送PPP连接建立的第1条交互语句子程序
void EXCH_SEND1()
{
WORD xdata i,len=22;
// WDTCN = 0xA5;
Fcs16(EXCHANGE1,len);
for(i=0;i<len;i++)
{
TI = 0;
SBUF = EXCHANGE1[i];
while(TI==0); TI = 0;
}
}
//******************************************************
// 发送PPP连接建立的第2条交互语句子程序
//*******************************************************
void EXCH_SEND2()
{
WORD xdata i,len=30;
// WDTCN = 0xA5;
Fcs16(EXCHANGE2,len);
for(i=0;i<len;i++)
{
TI = 0;
SBUF = EXCHANGE2[i];
while(TI==0); TI = 0;
}
}
//***************************************************
// 发送PPP连接建立的第3条交互语句子程序
//**************************************************
void EXCH_SEND3()
{
WORD xdata i,len=21;
// WDTCN = 0xA5;
Fcs16(EXCHANGE3,len);
for(i=0;i<len;i++)
{
TI = 0;
SBUF = EXCHANGE3[i];
while(TI==0); TI = 0;
}
}
//******************************************************
// 发送PPP连接建立的第4条交互语句子程序
//*****************************************************
void EXCH_SEND4()
{
WORD xdata i,len=21;
// WDTCN = 0xA5;
Fcs16(EXCHANGE4,len);
for(i=0;i<len;i++)
{
TI = 0;
SBUF = EXCHANGE4[i];
while(TI==0); TI = 0;
}
}
//******************************************************
// 发送PPP连接建立的第5条交互语句子程序
//*****************************************************
void EXCH_SEND5()
{
WORD xdata i,len=16;
// WDTCN = 0xA5;
Fcs16(EXCHANGE5,len);
for(i=0;i<len;i++)
{
TI = 0;
SBUF = EXCHANGE5[i];
while(TI==0); TI = 0;
}
}
//**********************************************************
// 发送PPP连接建立的第6条交互语句子程序
//***********************************************************
void EXCH_SEND6()
{
评论3
最新资源