📄 gprs080228.c
字号:
#include "w77e532.h"
#include "16c554.h"
#include "gprs.h"
#include "mcuInit.h"
#include "string.h"
#include "stdio.h"
#include "global.h"
#include "commoninterface.h"
extern Uchar volatile xdata D12_Y5;
extern idata Uchar D18CS;//D12_Y5的寄存器
//#define PWRKEY_PIN P3_5 /*工作时为高电平*/
//#define PWRENABLE_PIN P1_5 /*工作时为高电平*/
//#define RESET_ALL P1_5 /*工作时为高电平*/
AT_STRING_STRUCT code at_cmd[]
={
{"AT\r",0},
{"ATE0+COLP=1\r",1}, /**/
{"AT+CCID\r", 2},
{"AT+CIPSTART=\"UDP\",", 3},
{"AT+CIPSEND=", 4},
{"AT+CIPCLOSE\r", 5},
{"ATD", 6},
{"ATA\r", 7},
{"ATH\r", 8},
{"AT+CSTT", 9},
{"AT+CIICR\r", 10},
{"AT+CIFSR\r", 11},
{"AT+CLVL=100;+CMIC=0,6\r", 12},
{"AT+CIPSTATUS\r", 13},
//AT+CIPSHUT
{"",}
};
AT_STRING_STRUCT code at_ret[]
={
{"\r\n",AT_RET_CRLF},
{"OK\r\n",AT_RET_OK},
{"8986",AT_RET_CCID},
{"CONNECT OK\r\n",AT_RET_CONNECT_OK},
{">", AT_RET_PROMPT},
{"SEND OK",AT_RET_SEND_OK},
{"CLOSE OK",AT_RET_CLOSE_OK},
{"+CSQ:",AT_RET_CSQ},
{"NJPT", AT_RET_NJPT},
{"STATE:CONNECT OK",AT_RET_STATE_OK},
{"ALREADY CONNECT",AT_RET_ALREADY_CONNECT},
{"RING",AT_RET_RING},
{"NO CARRIER",AT_RET_NO_CARRIER},
{"BUSY",AT_RET_BUSY},
{"+COLP:",AT_RET_COLP},
{"AT",AT_RET_AT},
{"AT+CSQ", AT_RET_ATCSQ},
{"+CLVL", AT_RET_VOLUME},
//AT+CSQ
//SEND FAIL
{"",0} /*end of struct*/
};
char gprsRcvBuffer[1024];
GPRS_INFO_STRUCT gprsInfo;
IP_INFO_STRUCT ipInfo;
/*************************cj add 时间:2007年3月21日
*为了保证处于振铃状态下,如果20秒内还没有连续的振铃,则表示此时已经没有必要再等待振铃*/
#define MAX_RINGLENG 21
unsigned char gRingClock = 0;
void set_ringtimeout()
{
gRingClock = MAX_RINGLENG;
}
void ringClockTimeout()
{
if (gprsInfo.state == STATE_VOICE_RING)
{
gRingClock--;
if (0 == gRingClock)
gprsInfo.state = STATE_IDLE;;
}
}
extern char debug_msg[1024];
/*****以上内容填加结束*********************/
void debugDump(char flag, char *ptr, unsigned char len)
{
//for debug
/* if (0 == flag)
{
memcpy(debug_msg, ptr, len);
sioc_send(debug_msg, len);
}*/
}
void gprs_reset(unsigned char nPos)
{
sprintf(debug_msg, "模块重启:%2bd;%2bd;%2bd;%2bd\r\n", nPos, ipInfo.rxTimer, gprsInfo.txTimer, gprsInfo.state);
sioc_send(debug_msg, strlen(debug_msg));
ipInfo.rxTimer = 0;
gprsInfo.state = STATE_BEGIN;
}
void gprs_init(void)
{
D18CS = 0x03;
D12_Y5 = D18CS;
tl16c554_init();
clear_ram(gprsRcvBuffer,sizeof(gprsRcvBuffer));
clear_ram((char *)&ipInfo, sizeof(ipInfo) );
clear_ram((char *)&gprsInfo, sizeof(gprsInfo) );
gprsInfo.valid = 0;
gprsInfo.rxBytes = 0;
gprsInfo.rxPtr = gprsRcvBuffer;
gprs_reset(1);
}
char gprs_packet_send(char *ptr, unsigned int len)
{
/*xhb_debug 1*/
if (len > 256)
debugDump(1, ptr, 250);
else
debugDump(1, ptr, len);
gprsInfo.txTimer = 60;
at_serial_send(ptr, len);
return(0);
}
void gprs_send_apn(void)
{
clear_ram(gprsInfo.cmdBuffer,sizeof(gprsInfo.cmdBuffer) );
strcpy(gprsInfo.cmdBuffer, "AT+CSTT=\"bus8-xit.he\",\"\",\"\"\r");
gprs_packet_send(gprsInfo.cmdBuffer, strlen(gprsInfo.cmdBuffer));
}
void gprs_send_connect(void)
{
char *ptr;
unsigned char ipAddr[6];
unsigned int ipPort;
clear_ram(gprsInfo.cmdBuffer,sizeof(gprsInfo.cmdBuffer) );
strcpy(gprsInfo.cmdBuffer, at_cmd[AT_CMD_CONNECT].str);
get_serverIp(ipAddr);
ipPort = ipAddr[4] * 256 + ipAddr[5];
ptr = gprsInfo.cmdBuffer + strlen(gprsInfo.cmdBuffer);
sprintf(ptr, "\"%bu.%bu.%bu.%bu\",\"%u\"\r", \
ipAddr[0],ipAddr[1],ipAddr[2],ipAddr[3],ipPort);
gprs_packet_send(gprsInfo.cmdBuffer, strlen(gprsInfo.cmdBuffer));
}
void gprs_transmit_process(void)
{
char *ptr;
static unsigned char count;
switch(gprsInfo.state )
{
case STATE_BEGIN:
count = 0; /*关闭GPRS电源1秒*/
gprsInfo.state = STATE_RESET;
gprsInfo.resetCount ++;
gprsInfo.errorCount = 0;
gprsInfo.txTimer = 0;
ipInfo.rxTimer = 0;
break;
case STATE_RESET:
count ++;
D18CS &= 0x0b;
D12_Y5 = D18CS;
// PWRENABLE_PIN = 0;
if( count >= 20*2 )
{
count = 0;
gprsInfo.state = STATE_POWER_HOLD;
}
break;
case STATE_POWER_HOLD: /**/
count ++;
D18CS |= 0x0c;
D12_Y5 = D18CS;
/* PWRKEY_PIN = 1;
PWRENABLE_PIN = 1;*/
if( count >= 20*3 ) //2
{
count = 0;
gprsInfo.state = STATE_PWRKEY_LOW;
}
break;
case STATE_PWRKEY_LOW: /*要保持低电平2秒*/
count ++;
D18CS &= 0x07;
D12_Y5 = D18CS;
// PWRKEY_PIN = 0;
if( count >= 20*3 )
{
count = 0;
gprsInfo.state = STATE_PWRKEY_HIGH;
}
break;
case STATE_PWRKEY_HIGH: /*要保持高电平1秒*/
count ++;
D18CS |= 0x08;
D12_Y5 = D18CS;
// PWRKEY_PIN = 1;
if( count >= 20*3 ) //5
{
count = 0;
gprsInfo.state = STATE_SEND_PREINIT;
}
break;
case STATE_SEND_PREINIT:
gprsInfo.state = STATE_RECEIVE_PREINIT;
ptr = at_cmd[AT_CMD_AT].str;
gprs_packet_send(ptr, strlen(ptr) );
gprsInfo.txTimer = 20;
break;
case STATE_SEND_INIT:
gprsInfo.state = STATE_RECEIVE_INIT;
ptr = at_cmd[AT_CMD_INIT].str;
gprs_packet_send(ptr, strlen(ptr) );
break;
/****cj add for set volume***/
case STATE_SEND_SET_VOLUME:
gprsInfo.state = STATE_RECIEVE_SET_VOLUME;
ptr = at_cmd[AT_CMD_SET_VOLUME].str;
gprs_packet_send(ptr, strlen(ptr) );
break;
/***end of add *****/
case STATE_SEND_CCID:
gprsInfo.state = STATE_RECEIVE_CCID;
ptr = at_cmd[AT_CMD_CCID].str;
gprs_packet_send(ptr, strlen(ptr) );
break;
case STATE_SEND_APN:
#if 1
/*不是APN接入时采用此段程序*/
count ++;
gprsInfo.txTimer = 0;
if( count >= 20*10 )
{
count = 0;
gprsInfo.state = STATE_SEND_CONNECT;
}
break;
#endif
gprsInfo.state = STATE_RECEIVE_APN;
gprs_send_apn();
break;
case STATE_SEND_ACTIVE:
gprsInfo.state = STATE_RECEIVE_ACTIVE;
ptr = at_cmd[AT_CMD_GPRS_ACTIVE].str;
gprs_packet_send(ptr, strlen(ptr) );
gprsInfo.txTimer = 0;
break;
case STATE_SEND_GET_IP:
if( count == 0 )
{
count ++;
ptr = at_cmd[AT_CMD_GET_IP].str;
gprs_packet_send(ptr, strlen(ptr) );
gprsInfo.txTimer = 0;
}
else if( count >= 40 )
{
gprsInfo.state = STATE_SEND_CONNECT;
}
else
count ++;
break;
case STATE_SEND_CONNECT:
gprsInfo.state = STATE_RECEIVE_CONNECT;
gprs_send_connect();
gprsInfo.txTimer = 0;
break;
case STATE_SEND_PACKET_INIT:
gprsInfo.state = STATE_RECEIVE_PACKET_INIT;
ptr = at_cmd[AT_CMD_AT].str;
gprs_packet_send(ptr, strlen(ptr) );
gprsInfo.txTimer = 20;
break;
case STATE_SEND_POWER:
gprsInfo.state = STATE_RECEIVE_POWER;
gprs_packet_send("AT+CSQ\r", 7 );
gprsInfo.txTimer = 40;
break;
case STATE_SEND_UDP_LENGTH:
gprsInfo.state = STATE_WAIT_PROMPT;
gprsInfo.errorCount = 0;
clear_ram(gprsInfo.cmdBuffer,sizeof(gprsInfo.cmdBuffer) );
strcpy(gprsInfo.cmdBuffer, at_cmd[AT_CMD_IP_SEND].str);
ptr = gprsInfo.cmdBuffer + strlen(at_cmd[AT_CMD_IP_SEND].str);
sprintf(ptr, "%u\r", ipInfo.txLength); /*xhb_debug*/
gprs_packet_send(gprsInfo.cmdBuffer, strlen(gprsInfo.cmdBuffer) );
break;
case STATE_SEND_UDP_PACKET:
gprsInfo.state = STATE_WAIT_UDP_OK;
ipInfo.txCount ++;
gprs_packet_send(ipInfo.txBuffer, ipInfo.txLength );
break;
case STATE_IDLE:
if( gprsInfo.outCallNumber[0] )
gprsInfo.state = STATE_VOICE_CALLING;
break;
case STATE_VOICE_CALLING:
gprsInfo.state = STATE_VOICE_OUT;
clear_ram(gprsInfo.cmdBuffer,sizeof(gprsInfo.cmdBuffer) );
strcpy(gprsInfo.cmdBuffer, at_cmd[AT_CMD_DIAL].str);
ptr = gprsInfo.cmdBuffer + strlen(at_cmd[AT_CMD_DIAL].str);
sprintf(ptr, "%s;\r", gprsInfo.outCallNumber);
gprs_packet_send(gprsInfo.cmdBuffer, strlen(gprsInfo.cmdBuffer) );
gprsInfo.outCallNumber[0] = 0;
break;
case STATE_HOLD_OFF:
gprsInfo.state = STATE_IDLE;
clear_ram(gprsInfo.cmdBuffer,sizeof(gprsInfo.cmdBuffer) );
strcpy(gprsInfo.cmdBuffer, at_cmd[AT_CMD_HOLD_OFF].str);
gprs_packet_send(gprsInfo.cmdBuffer, strlen(gprsInfo.cmdBuffer) );
break;
case STATE_HOLD_ON:
gprsInfo.state = STATE_VOICE_IN;
clear_ram(gprsInfo.cmdBuffer,sizeof(gprsInfo.cmdBuffer) );
strcpy(gprsInfo.cmdBuffer, at_cmd[AT_CMD_HOLD_ON].str);
gprs_packet_send(gprsInfo.cmdBuffer, strlen(gprsInfo.cmdBuffer) );
break;
}
}
char string_contain(char *srcStr, char *destStr)
{
while(*srcStr)
{
if( *srcStr++ != *destStr++ )
return(-1);
}
return(0);
}
void explain_at_return(void)
{
char *ptrChar;
unsigned char returnId;
unsigned char i;
ptrChar = gprsRcvBuffer;
do
{
returnId = 0;
for(i=0; *at_ret[i].str||returnId; i++)
{
if( string_contain(at_ret[i].str, ptrChar) == 0)
{
returnId = at_ret[i].memo;
if( returnId == AT_RET_CRLF )
{
ptrChar += strlen(at_ret[i].str);
break;
}
else if( returnId == AT_RET_NJPT )
{
ipInfo.rxState = 1;
ipInfo.rxTimer = 0;
ipInfo.rxCount ++;
ipInfo.rxLength = gprsInfo.rxBytes;
memcpy(ipInfo.rxBuffer, ptrChar, gprsInfo.rxBytes);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -