u8 KEY_Scan(u8 mode)

{

static u8 key_up=1;//按键按松开标志 (只进行一次初始化)

if(mode)key_up=1;  //支持连按

if(key_up&&(KEY0==0||KEY1==0||WK_UP==1))

{

delay_ms(10);//去抖动

key_up=0;

if(KEY0==0)return KEY0_PRES;

else if(KEY1==0)return KEY1_PRES;

else if(WK_UP==1)return WKUP_PRES;

}else if(KEY0==1&&KEY1==1&&WK_UP==0)key_up=1;

return 0;// 无按键按下

}

以下为GPS局部程序 应用的为静态变量、

//GPRS数据保存位置

static char GPRS_Data[MAXRECVBUFF]={0};

static int  GPRS_Dlen = 0;

static u8   GPRS_Dtu_ConLock = 0;

u8 RestartGprs = 0; //重启GPRS标志

#if GU906GSM_EN

//短信信息在SIM卡中的位置

static char SIMDataID[5]="";

struct user_simdata sim;

#endif

/*********************************************************

* @function  GPRS_ascii_to_hex

* @role

* @input

* @output    None

* @return

********************************************************/

static int GPRS_ascii_to_hex(u8 *asc_data, u8 *hex_data, int len)

{

int i;

u8 tmp_dat;

for(i = 0; i < len; i++)

{

if ((asc_data[i] >= '0') && (asc_data[i] <= '9')){

tmp_dat = asc_data[i] - '0';

}else if ((asc_data[i] >= 'A') && (asc_data[i] <= 'F')){ // A....F

tmp_dat = asc_data[i] - 0x37;

}

else if((asc_data[i] >= 'a') && (asc_data[i] <= 'f')){ // a....f

tmp_dat = asc_data[i] - 0x57;

}else return -1;

hex_data[i] = tmp_dat;

}

return 0;

}

/*********************************************************

* @function  mypow

* @role      pow库函数的实现,计算num的n次幂,其中n为整数

* @input     num

* @output    n

* @return    计算结果

*******************************************************

static int mypow(int num,int n)

{

int powint=1;

int i;

for(i=1;i<=n;i++) powint*=num;

return powint;

}

*/

/*********************************************************

* @function  FreeStr

* @role      删除字符串中的字串,支持16进制数据,无视结束符

* @input     字符串、字符串总长度、开始删除的起始位置、要删除的长度

* @output    None

* @return    None

********************************************************/

static void FreeStr(char *str, int strsiz, int head, int len)

{

int i = 0;

while(len--)

{

for(i = head; i < strsiz;i++)

{

str[i] = str[i+1];

}

}

}

#if GU906GSM_EN

/*********************************************************

* @function  GU906_ParsingSIM

* @role      解析SIM卡中的短信数据

* @input     卡中的数据

* @output    None

* @return    成功返回:0,失败返回:-1

@data

+CMGR: "REC READ","18750******",,"2015/03/14 20:02:15+32"

124abcABC

OK

********************************************************/

static int GU906_ParsingSIM(char *pinput)

{

char *p = pinput;

int i;

#if DEBUG_EN

printf("\n分离手机号\n");

#endif

if((p = strstr(p,"\",\"")) == 0)

return -1;

p += 3;

memset(sim.phone,0,sizeof(sim.phone));

for (i = 0; (*p != '\"') && (*p != '\0'); ++i,p++){

sim.phone[i] = *p;

}

sim.phone[i] = '\0';

#if DEBUG_EN

printf("sms.phone[%s]\r\n",sim.phone);

printf("\n分离设备类型\n");

#endif

p +=2;

memset(sim.dev,0,sizeof(sim.dev));

for (i = 0; (*p != ',') && (*p != '\0'); ++i,p++){

sim.dev[i] = *p;

}

#if DEBUG_EN

printf("sms.dev[%s]\r\n",sim.dev);

printf("\n分离时间\n");

#endif

p += 2;

memset(sim.date,0,sizeof(sim.date));

for (i = 0; (*p != '\"') && (*p != '\0'); ++i,p++){

sim.date[i] = *p;

}

#if DEBUG_EN

printf("sms.date[%s]\r\n",sim.date);

printf("\n分离数据\n");

#endif

p++;

memset(sim.data,0,sizeof(sim.data));

while((*p != '\0') && ((*p == '\n') || (*p == '\r')) ) p++;

for (i = 0; (*p != '\0') && (*p != '\n') && (*p != '\r'); ++i,p++){

sim.data[i] = *p;

}

sim.data[i] = '\0';

#if DEBUG_EN

printf("sms.data:[%s]\r\n",sim.data );

#endif

return 0;

}

#endif

/*********************************************************

* @function  GetRecvData

* @role      提取字符串中跟命令无关的数据,有时在进行命令操作时,

会突然收到短信,什么的,这里要做的就是处理并过滤掉这些数据。

还有模块突然复位了,这里也做判断,并复位CPU。

* @input     数据和数据长度

* @output    None

* @return    None

********************************************************/

static void GetRecvData(char *pBuff, int *pLen)

{

int rlen = 0;

char buff[5]="";

int i = 0;

char *p1 = NULL;

char *p2 = NULL;

if((pBuff == NULL) || (*pLen == 0))

return;

if (((p1 = strstr(pBuff, "+IPD,")) != 0) && ((p2 = strchr(pBuff, ':')) != 0))

{

p1+=5;

for (i = 0; ((p1-pBuff) < *pLen) && (i < 5) && (*p1 != ':'); ++i,++p1) {

buff[i] = *p1;

}

buff[i] = '\0';

rlen = atoi(buff);

p2++;

GPRS_Dlen = ((rlen >= (*pLen - (p2 - pBuff)))?(*pLen - (p2 - pBuff)):rlen);

memcpy(GPRS_Data, p2,GPRS_Dlen);

rlen = GPRS_Dlen;

p1 = strstr(pBuff, "+IPD,");

p2 = strchr(pBuff, ':');

rlen += ((p2+1)-p1);

FreeStr(pBuff, *pLen,p1-pBuff, rlen);

if((*pLen -rlen) <=3)

*pLen = 0;

else

*pLen -=rlen;

#if DEBUG_EN

printf("B[%d][%s]\r\n",*pLen, pBuff);

#endif

}

#if GU906GSM_EN

else if (strstr(pBuff, "+CMTI:") && ((p1 = strchr(pBuff, ',')) != 0)){   //+CMTI: "SM",2 有短信消息到来

rlen = 0;

p1++;

for(i = 0; *p1 != '\r' && *p1 != '\n' && *p1 != '\0' && rlen < sizeof(SIMDataID);i++, p1++){

if(*p1 >= '0' && *p1 <= '9')

SIMDataID[rlen++] = *p1;

}

SIMDataID[rlen] = '\0';

}

else if ((p1 = strstr(pBuff, "+CMGR:")) != 0){ //读取到短消息

GU906_ParsingSIM(p1);

}

#endif

else if(strstr(pBuff,"[0000]") || strstr(pBuff,"Build Time"))

{

#if (DEBUG_EN == 1)

printf("restart...\r\n\r\n");

#endif

RestartGprs = 1;

}

}

/*********************************************************

* @function  GetFreeBuff

* @role      处理掉缓存中多余的数据,同时也起到延时200ms的作用,

读取数据函数自带延时10ms,所以这里num=20,

GU906发送命令不能太快,不然GU906会因为处理不过来,而导致出错。

* @input     None

* @output    None

* @return    None

********************************************************/

static void GetFreeBuff(int num)

{

char buff[MAXRECVBUFF] = {0};

int siz = 0;

while(num--)

{

siz = usart4_Receive(buff,MAXRECVBUFF);

if(siz)

{

GetRecvData(buff, &siz);

}

}

}

/*********************************************************

* @function  SendAT

* @role      发送AT指令并接收

* @input     gprs:要发送的参数

* @output    out:返回的参数

* @return    成功返回:_ATOK,失败返回:_ATERROR

********************************************************/

static s8 SendAT(struct GprsData *gprs, char *out, u32 Delay)

{

int siz = 0;

int i = 0;

char *p = gprs->order;

u8 dat[2];

u8 csq = 0;

s8 ret = _ATERROR;

char buff[MAXRECVBUFF] = {0};

RestartGprs = 0;

#if (DEBUG_EN == 1)

printf("\r\n------------------------------\r\n");

printf("len[%d]\r\n", gprs->olen);

for(i = 0; i< gprs->olen; i++,++p)

printf("%c", *p);

printf("\r\n");

#endif

i = 0;

p = NULL;

GetFreeBuff(10);

usart4_Send(gprs->order,gprs->olen);

if((gprs->type == _GSMSEND) || (gprs->type == _ATATD))

{

ret = _ATOK;

goto GU906_SENDATRET;

}

while(1)

{

for(i = 0;ibuff[i]=0;

siz = 0; i = 0;

while(siz == 0)

{

siz = usart4_Receive(buff,MAXRECVBUFF);

if(siz){

#if (DEBUG_EN == 1)

printf("\r\nrecv:\r\n");

printf("[%s]\r\n",buff);

#endif

GetRecvData(buff, &siz);

}

if(i++ > Delay)

{

ret = _ATOTIME;

goto GU906_SENDATRET;

}

}

if(RestartGprs){

ret = _ATERROR;

goto GU906_SENDATRET;

}

switch(gprs->type)

{

case _AT:

case _ATE:

case _ATCNMI:

case _ATCMGD:

case _ATCMGF:

case _ATCSMP:

case _ATUCS2:

case _ATATH :

case _ATGSM :

case _ATCSTT:

case _ATCIICR:

case _ATCIPCFG:

case _ATCIPPACK:

case _ATCIPSCONT:

case _OPENDTU:

case _CLOSEDTU:

case _ATGB2312:

if(strstr(buff, "OK")){

ret = _ATOK;

goto GU906_SENDATRET;

}else if(strstr(buff, "ERROR") || strstr(buff,"NO CARRIER")) {

GetFreeBuff(100);

ret = _ATERROR;

goto GU906_SENDATRET;

}

break;

case _ATCPMS:

if(strstr(buff, "OK") && strstr(buff, "+CPMS:")){

ret = _ATOK;

goto GU906_SENDATRET;

}else if(strstr(buff, "ERROR")){

ret = _ATERROR;

goto GU906_SENDATRET;

}

break;

case _ATESIM:

ret = _ATERROR;

if(strstr(buff, "OK"))

{

if((p = strstr(buff, "+ESIMS: ")) != 0)

{

p += 8;

if(1 == (*p -'0'))

ret = _ATOK;

}

goto GU906_SENDATRET;

}

break;

case _ATCMGS:

if(strstr(buff, ">")){

GetFreeBuff(1);

ret = _ATOK;

goto GU906_SENDATRET;

}

break;

case _ATCSQ:

if(strstr(buff, "OK"))

{

if((p = strstr(buff, "+CSQ:")) != 0)

{

GPRS_ascii_to_hex((u8 *)(p+6), dat, 2);

csq = dat[0]*10 + dat[1];

#if DEBUG_EN

printf("信号:[%d]\r\n", csq);

#endif

if (csq < 99 && csq >= GPRSCSQ){ //网络信号要大于GPRSCSQ(18)

ret = _ATOK;

goto GU906_SENDATRET;

} else {

ret = _ATERROR;

goto GU906_SENDATRET;

}

}

}

else{

ret = _ATERROR;

goto GU906_SENDATRET;

}

break;

case _ATCIPSTARTOK:

if(strstr(buff, "OK"))

{

if (strstr(buff, "+CIPSTART:")) {

ret = _ATOK;

goto GU906_SENDATRET;

}

ret = _ATERROR;

goto GU906_SENDATRET;

}else if(strstr(buff, "ERROR")) {

ret = _ATERROR;

goto GU906_SENDATRET;

}

break;

case _ATCREG:

if(strstr(buff, "OK"))

{

if ((p = strstr(buff, "+CREG: ")) != 0)

{

p += 7;

if(('0' == *p) || ('5' == *p))

{

ret = _ATOK;

goto GU906_SENDATRET;

}

}

ret = _ATERROR;

goto GU906_SENDATRET;

}else if(strstr(buff, "ERROR")) {

ret = _ATERROR;

goto GU906_SENDATRET;

}

break;

case _ATCIPSEND:

if (strstr(buff, ">")) {

ret = _ATOK;

goto GU906_SENDATRET;

}

else if (strstr(buff, "ERROR")){

ret = _ATERROR;

goto GU906_SENDATRET;

}

break;

case _ATCIPMUX:

if(strstr(buff, "+CIPMUX: 0") && strstr(buff, "OK")) {

ret = _ATOK;

goto GU906_SENDATRET;

}else if (strstr(buff, "ERROR")){

ret = _ATERROR;

goto GU906_SENDATRET;

}

break;

case _ATCIPMODE:

if(strstr(buff, "+CIPMODE: ") && strstr(buff, "OK")) {

ret = _ATOK;

goto GU906_SENDATRET;

}else if (strstr(buff, "ERROR")){

ret = _ATERROR;

goto GU906_SENDATRET;

}

break;

case _GPRSSEND:

if(strstr(buff, "SEND OK")) {

ret = _ATOK;

goto GU906_SENDATRET;

}

break;

case _ATCMGR:

GetRecvData(buff, &siz);

ret = _ATOK;

goto GU906_SENDATRET;

//break;

case _ATCIPCLOSE:

if (strstr(buff, "CLOSE OK") || strstr(buff, "+CME ERROR:")) {

ret = _ATOK;

goto GU906_SENDATRET;

}

else if(strstr(buff, "ERROR")){

ret = _ATERROR;

goto GU906_SENDATRET;

}

break;

case _ATCIPSTART:

if(!GPRS_Dtu_ConLock)

{

if(strstr(buff, "CONNECT OK")){

ret = _ATOK;

goto GU906_SENDATRET;

}

else if(strstr(buff, "RECONNECTING") || strstr(buff, "ERROR") || strstr(buff, "CONNECT FAIL")){

GetFreeBuff(100);

ret = _ATERROR;

goto GU906_SENDATRET;

}

}

else if(strstr(buff, "OK")){

ret = _ATOK;

goto GU906_SENDATRET;

}

else if(strstr(buff, "ERROR")){

ret = _ATERROR;

goto GU906_SENDATRET;

}

break;

case _GSMSENDEND:

GetFreeBuff(100);

ret = _ATOK;

goto GU906_SENDATRET; //忽略返回信息

/*

if(strstr(buff, "+CMGS:")) {

if(strstr(buff, "OK"))

return _ATOK;

lock = 1;

}

else if(lock && strstr(buff, "OK")) {

return _ATOK;

}else return _ATOK; //忽略返回信息

break;

*/

case _ATCIPSCONT_C:

if(strstr(buff,"OK"))

{

printf("Line:%d\r\n",__LINE__);

if(0 != (p = strstr(buff,"+CIPMODE: ")))

{

p += 10;

printf("Line:%d\r\n",__LINE__);

if(1 == (*p -'0'))

{

printf("Line:%d\r\n",__LINE__);

if(0 != (p = strstr(buff,"+CIPSTART: ")))

{

printf("Line:%d\r\n",__LINE__);

if(strstr(buff,"218.66.59.201") && strstr(buff,"8888"))

{

printf("DTU OK\r\n");

GPRS_Dtu_ConLock = 1;

ret = _ATOK;

goto GU906_SENDATRET;

}

}

}

}

GPRS_Dtu_ConLock = 0;

ret = _ATOK;

goto GU906_SENDATRET;

}else if(strstr(buff, "ERROR")){

ret = _ATERROR;

goto GU906_SENDATRET;

}

break;

default: break;

}

}

GU906_SENDATRET:

return ret;

}

/*********************************************************

* @function  GU906_ExecuteOrder

* @role      执行命令

* @input     None

* @output    None

* @return    成功返回:_ATOK,失败返回:_ATERROR,超时返回:_ATOTIME

********************************************************/

static s8 GU906_ExecuteOrder(char *Order, u32 len, enum order type, u32 num)

{

u32 i = 0;

u32 delay_time = 1000;

s8 ret = _ATOTIME;

struct GprsData gprs;

if(type == _ATCIPSTART)

delay_time = 4000;

if(type == _GPRSSEND)

delay_time = 10;

gprs.order = Order;

gprs.olen = len;

gprs.type = type;

while((ret = SendAT(&gprs, NULL, delay_time)) != _ATOK)

{

if(ret == _ATERROR) {

if(++i >= num) return _ATERROR;

delay_s(1);

}else return _ATOTIME;

}

return _ATOK;

}

/*********************************************************

* @function  GU906_init

* @role      GSM初始化

* @input     None

* @output    None

* @return    成功返回:_ATOK,失败返回:_ATERROR,超时返回:_ATOTIME

********************************************************/

s8 GU906_init(void)

{

s8 ret = _ATOTIME;

// 开回显:ATE1 关回显:ATE0

if(_ATOK != (ret = GU906_ExecuteOrder(ATE(0), strlen(ATE(0)), _ATE, 2)))

return ret;

// 查询卡是否存在

if(_ATOK != (ret = GU906_ExecuteOrder(ATESIM, strlen(ATESIM), _ATESIM, 10)))

return ret;

#if GU906GSM_EN

// 设置短信模式为text模式

if(_ATOK != (ret = GU906_ExecuteOrder(ATCMGF, strlen(ATCMGF), _ATCMGF, 2)))

return ret;

// 设置短信存储单元为SIM卡

if(_ATOK != (ret = GU906_ExecuteOrder(ATCPMS, strlen(ATCPMS), _ATCPMS, 2)))

return ret;

// 设置这组参数来了新信息存储起来

if(_ATOK != (ret = GU906_ExecuteOrder(ATCNMI, strlen(ATCNMI), _ATCNMI, 2)))

return ret;

#endif

//删除SIM卡中的所有短信

if(_ATOK != (ret = GU906_ExecuteOrder(ATCMGD, strlen(ATCMGD), _ATCMGD, 2)))

return ret;

//查询信号强度 信号强度大于等于18才行

while(_ATOK != (ret = GU906_ExecuteOrder(ATCSQ, strlen(ATCSQ), _ATCSQ, 60)))

{

if(ret == _ATOTIME) return ret;

}

return _ATOK;

}

/*********************************************************

* @function  GU906_Module_State

* @role      判断GU906的状态

* @input     None

* @output    None

* @return    成功返回:_ATOK,失败返回:_ATERROR,超时返回:_ATOTIME

********************************************************/

s8 GU906_Module_State(void)

{

return GU906_ExecuteOrder(AT, strlen(AT), _AT, 0);

}

/*********************************************************

* @function  GU906_TCP_Socket

* @role      进行TCP连接

* @input     IP地址与端口

* @output    None

* @return    成功返回:_ATOK,失败返回:_ATERROR,超时返回:_ATOTIME

********************************************************/

s8 GU906_TCP_Socket(struct Gprs_Config *GprsCon)

{

char cipstart[100] = {0};

s8 ret = _ATOTIME;

if(GprsCon->server_ip == NULL || !GprsCon->server_port) return ret;

if(!strlen((char *)GprsCon->server_ip)) return ret;

//确保模块以及注册到GSM网络

if(_ATOK != (ret = GU906_ExecuteOrder(ATCREG, strlen(ATCREG), _ATCREG, 2)))

return ret;

//让模块激活 GPRS 网络,在需要反复建立 TCP 链接的场合可提高速度

if(_ATOK != (ret = GU906_ExecuteOrder(ATCIICR, strlen(ATCIICR), _ATCIICR, 2)))

return ret;

//查询当前是否有网络连接

while(_ATOK == GU906_ExecuteOrder(ATCIPSTARTOK, strlen(ATCIPSTARTOK), _ATCIPSTARTOK, 0))

{

//关闭网络连接

if(_ATOK != (ret = GU906_ExecuteOrder(ATCIPCLOSE, strlen(ATCIPCLOSE), _ATCIPCLOSE, 2)))

return ret;

//保存设置

if(_ATOK != (ret = GU906_ExecuteOrder(ATCIPSCONT(0), strlen(ATCIPSCONT(0)), _ATCIPSCONT, 2)))

return ret;

}

//单链接模式

if(_ATOK != (ret = GU906_ExecuteOrder(ATCIPMUX, strlen(ATCIPMUX), _ATCIPMUX, 2)))

return ret;

//非数据透传输模式

if(_ATOK != (ret = GU906_ExecuteOrder(ATCIPMODE(0), strlen(ATCIPMODE(0)), _ATCIPMODE, 2)))

return ret;

//自动启动连接命令

if(_ATOK != (ret = GU906_ExecuteOrder(ATCIPCFG(0), strlen(ATCIPCFG(0)), _ATCIPCFG, 2)))

return ret;

//心跳包设置

if(_ATOK != (ret = GU906_ExecuteOrder(ATCIPPACK(0), strlen(ATCIPPACK(0)), _ATCIPPACK, 2)))

return ret;

//连接到服务器

//cipstart=(char *)mymalloc(100);

//if(cipstart==NULL) return -1;

sprintf(cipstart, ATCIPSTART,"TCP", GprsCon->server_ip, GprsCon->server_port);

ret = GU906_ExecuteOrder(cipstart, strlen(cipstart), _ATCIPSTART, 3);

//myfree(cipstart);

return ret;

}

/*********************************************************

* @function  GU906_DTU_Socket

* @role      设置透传模式

* @input     IP地址与端口

* @output    None

* @return    成功返回:_ATOK,失败返回:_ATERROR,超时返回:_ATOTIME

********************************************************/

s8 GU906_DTU_Socket(struct Gprs_Config *GprsCon)

{

char atorder[100] = "";

s8 ret = _ATOTIME;

if(GprsCon->server_ip == NULL || !GprsCon->server_port) return ret;

if(!strlen((char *)GprsCon->server_ip)) return ret;

//atorder=(char *)mymalloc(100);

//if(atorder==NULL) return -1;

//查询数据透设置情况

if(_ATOK != (ret = GU906_ExecuteOrder(ATCIPSCONT_C, strlen(ATCIPSCONT_C), _ATCIPSCONT_C, 2)))

goto GU906_DTU_SOCKETEND;

if(!GPRS_Dtu_ConLock)

{

//设置账号

if(_ATOK != (ret = GU906_ExecuteOrder(ATCSTT, strlen(ATCSTT), _ATCSTT, 2)))

goto GU906_DTU_SOCKETEND;

//透传参数设置

if(_ATOK != (ret = GU906_ExecuteOrder(ATCIPCFG(1), strlen(ATCIPCFG(1)), _ATCIPCFG, 2)))

goto GU906_DTU_SOCKETEND;

//设置心跳

if(_ATOK != (ret = GU906_ExecuteOrder(ATCIPPACK(0), strlen(ATCIPPACK(0)), _ATCIPPACK, 2)))

goto GU906_DTU_SOCKETEND;

//设置设备注册包

if(_ATOK != (ret = GU906_ExecuteOrder(ATCIPPACK(1), strlen(ATCIPPACK(1)), _ATCIPPACK, 2)))

goto GU906_DTU_SOCKETEND;

//单链接模式

if(_ATOK != (ret = GU906_ExecuteOrder(ATCIPMUX, strlen(ATCIPMUX), _ATCIPMUX, 2)))

goto GU906_DTU_SOCKETEND;

//数据透传输模式

if(_ATOK != (ret = GU906_ExecuteOrder(ATCIPMODE(1), strlen(ATCIPMODE(1)), _ATCIPMODE, 2)))

goto GU906_DTU_SOCKETEND;

//保存设置

sprintf(atorder, ATCIPSCONT(1),"TCP", GprsCon->server_ip, GprsCon->server_port);

if(_ATOK != (ret = GU906_ExecuteOrder(atorder, strlen(atorder), _ATCIPSCONT, 2)))

goto GU906_DTU_SOCKETEND;

GPRS_Dtu_ConLock = 1;

}

//建立数据透连接

sprintf(atorder, ATCIPSTART, "TCP", GprsCon->server_ip, GprsCon->server_port);

if(_ATOK != (ret = GU906_ExecuteOrder(atorder, strlen(atorder), _ATCIPSTART, 2)))

goto GU906_DTU_SOCKETEND;

GU906_DTU_SOCKETEND:

//myfree(atorder);

return ret;

}

/*********************************************************

* @function  GU906_DtuOrAT

* @role      透传模式与AT模式转换

* @input     None

* @output    None

* @return    成功返回:_ATOK,失败返回:_ATERROR,超时返回:_ATOTIME

********************************************************/

s8 GU906_DtuOrAT(u8 type)

{

s8 ret = _ATERROR;

if(type)

{

while(!GPRS_Dtu_ConLock)

{

//打开透传

delay_s(2);

if(_ATOK != (ret = GU906_ExecuteOrder(OPENDTU, strlen(OPENDTU), _OPENDTU, 0)))

goto GU906_DTUOFFONEND;

GPRS_Dtu_ConLock = 1;

}

}

else

{

while(GPRS_Dtu_ConLock)

{

//关闭透传

delay_s(2);

if(_ATOK != (ret = GU906_ExecuteOrder(CLOSEDTU, strlen(CLOSEDTU), _CLOSEDTU, 0)))

{

delay_s(1);

if(_ATOK != (GU906_Module_State()))

goto GU906_DTUOFFONEND;

}

GPRS_Dtu_ConLock = 0;

}

}

GU906_DTUOFFONEND:

return ret;

}

/*********************************************************

* @function  GU906_GPRS_write

* @role      gprs发送数据

* @input     要发送的数据与数据长度

* @output    None

* @return    成功返回:_ATOK,失败返回:_ATERROR,超时返回:_ATOTIME

********************************************************/

s8 GU906_GPRS_write(char* pdat, int len)

{

char atorder[20] = "";

s8 ret = -1;

if(strlen(pdat) == 0) return 0;

//atorder = (char *)mymalloc(20);

//if(atorder == NULL) return -1;

if(!GPRS_Dtu_ConLock)//非数据透模式

{

//设置数据长度

sprintf(atorder, ATCIPSEND(1), len);

if(_ATOK != (ret = GU906_ExecuteOrder(atorder, strlen(atorder), _ATCIPSEND, 0)))

goto GU906_GPRS_WRITERET;

//发送数据

if(_ATOK != (ret = GU906_ExecuteOrder(pdat, len, _GPRSSEND, 0)))

goto GU906_GPRS_WRITERET;

}

else

{

//发送数据

usart4_Send(pdat, len);

ret = _ATOK;

}

GU906_GPRS_WRITERET:

//myfree(atorder);

return ret;

}

/*********************************************************

* @function  GU906_GPRS_read

* @role      查询是否接收到数据

* @input     输出缓存大小

* @output    接收到的数据

* @return    接收到的数据长度

********************************************************/

u32 GU906_GPRS_read(char *pout, int len)

{

int i = 0;

if(!GPRS_Dtu_ConLock)

{

GPRSREAD:

if(GPRS_Dlen){

for(i = 0;(i < GPRS_Dlen) && (i < (len -1)); i++){

pout[i] = GPRS_Data[i];

}

memset(GPRS_Data, 0, sizeof(GPRS_Data));

GPRS_Dlen = 0;

return i;

}else{

GetFreeBuff(1);

if(GPRS_Dlen)

goto GPRSREAD;

}

}

else

{

return usart4_Receive(pout,len);

}

return 0;

}

/*********************************************************

* @function  GU906_make_phone

* @role      向指定的手机拨号

* @input     手机号

* @output    None

* @return    成功返回:_ATOK,失败返回:_ATERROR,超时返回:_ATOTIME

********************************************************/

s8 GU906_make_phone(char *phone)

{

char mphone[20]="";

sprintf(mphone, ATATD, phone);

return GU906_ExecuteOrder(mphone, strlen(mphone), _ATATD, 0);

}

/*********************************************************

* @function  GU906_Answer_Phone

* @role      等待电话被接听

* @input     手机号

* @output    None

* @return    成功返回:_ATOK,失败返回:_ATERROR,超时返回:_ATOTIME

********************************************************/

s8 GU906_Answer_Phone(u32 Delay)

{

int siz = 0;

u32 i = 0;

char buff[MAXRECVBUFF] = "";

i = 0;

while(1)

{

siz = 0;

siz = usart4_Receive(buff,MAXRECVBUFF);

if(siz){

GetRecvData(buff, &siz);

if(strstr(buff, "+COLP:") && strstr(buff, "OK")){

return _ATOK;

}else if(strstr(buff, "NO CARRIER") || strstr(buff, "+CREG: 1") || strstr(buff, "ERROR")){

return _ATERROR;

}

}

if(i++ > Delay)

{

return _ATOTIME;

}

}

}

/*********************************************************

* @function  GU906_end_phone

* @role      挂机

* @input     None

* @output    None

* @return    成功返回:_ATOK,失败返回:_ATERROR,超时返回:_ATOTIME

********************************************************/

s8 GU906_end_phone(void)

{

return GU906_ExecuteOrder(ATATH, strlen(ATATH), _ATATH, 0);

}

#if GU906GSM_EN

/*********************************************************

* @function  GU906_Chinese_text

* @role      向指定的手机发送中文短信

* @input     phone 手机号指针,pmsg 短消息指针

* @output    None

* @return    成功返回:_ATOK,失败返回:_ATERROR,超时返回:_ATOTIME

********************************************************/

s8 GU906_Chinese_text(char *phone,char* pmsg)

{

s8 ret = _ATOTIME;

char atphone[50] = "";

char end[]={0x1A,0x00};

if(strlen(phone) != 11)  return _ATERROR;

//atphone = (char *)mymalloc(50);

//if(atphone == NULL) return -1;

//设置短消息为txet模式

if(_ATOK != (ret = GU906_ExecuteOrder(ATCMGF, strlen(ATCMGF), _ATCMGF, 2)))

goto GU906_CHINESE_TEXTEND;

//设置GB2312编码

if(_ATOK != (ret = GU906_ExecuteOrder(ATGB2312, strlen(ATGB2312), _ATGB2312, 2)))

goto GU906_CHINESE_TEXTEND;

//设置这组参数来了新信息存储起来

if(_ATOK != (ret = GU906_ExecuteOrder(ATCNMI, strlen(ATCNMI), _ATCNMI, 2)))

goto GU906_CHINESE_TEXTEND;

//设置用户手机号

sprintf(atphone,ATCMGS,phone);

if(_ATOK != (ret = GU906_ExecuteOrder(atphone, strlen(atphone), _ATCMGS, 2)))

goto GU906_CHINESE_TEXTEND;

//发送数据

if(_ATOK == (ret = GU906_ExecuteOrder(pmsg, strlen(pmsg), _GSMSEND, 0)))

{

ret = GU906_ExecuteOrder(end, 1, _GSMSENDEND, 0);

}

GU906_CHINESE_TEXTEND:

//myfree(atphone);

return ret;

}

/*********************************************************

* @function  GU906_Read_SIM

* @role      读取短信信息

* @input     短信在SIM卡中的位置

* @output    None

* @return    成功返回:_ATOK,失败返回:_ATERROR,超时返回:_ATOTIME

********************************************************/

static s8 GU906_Read_SIM(char *pnum)

{

s8 ret = _ATOTIME;

char cmgr[20]="";

//读取短信的编码格式为GB2312

if(_ATOK != (ret = GU906_ExecuteOrder(ATGB2312, strlen(ATGB2312), _ATGB2312, 2)))

return ret;

//读取短消息

sprintf(cmgr,ATCMGR,pnum);

return GU906_ExecuteOrder(cmgr, strlen(cmgr), _ATCMGR, 2);

}

/*********************************************************

* @function  GU906_DeleteSms

* @role      删除SIM卡中的所有短信

* @input     None

* @output    None

* @return    成功返回:_ATOK,失败返回:_ATERROR,超时返回:_ATOTIME

********************************************************/

static int GU906_DeleteSms(void)

{

return GU906_ExecuteOrder(ATCMGD, strlen(ATCMGD), _ATCMGD, 2);

}

/*********************************************************

* @function  GU906_Read_UserSMS

* @role      查询并读取短信数据

* @input     None

* @output    None

* @return    0,接收到新数据,-1,未接收到新数据

********************************************************/

s8 GU906_Read_UserSMS(void)

{

SMSREAD:

if(strlen(SIMDataID)){

#if DEBUG_EN

printf("SIMDataID[%s]\r\n",SIMDataID);

#endif

GU906_Read_SIM(SIMDataID);

GU906_DeleteSms();

memset(SIMDataID,0,sizeof(SIMDataID));

return 0;

}else{

GetFreeBuff(1);

if(strlen(SIMDataID))

goto SMSREAD;

}

return -1;

}

#endif

gu906.文件如下

#ifndef _GU906_H_

#define _GU906_H_

#include "sys.h"

#define GU906GSM_EN   1    //是否开启短信功能

#define GPRSCSQ       18   //信号强度,在使用GPRS功能时,最低要求信号强度不得低于18

#define _ATOK          0  //执行成功

#define _ATERROR      -1  //执行错误

#define _ATOTIME      -2  //执行超时

#define _LINKNOT      -3  //掉线了

struct Gprs_Config{

u8 *server_ip;     //服务器IP

u32 server_port;   //服务器端口

};

#if GU906GSM_EN

//根据实际内存情况而定

struct user_simdata{

char phone[15];  //用户手机号

char dev[50];    //用户使用的设备

char date[50];   //接收时间

char data[200];  //接收的数据

};

extern struct user_simdata sim;

s8 GU906_Read_UserSMS(void);

s8 GU906_Chinese_text(char *phone,char* pmsg);

#endif

s8  GU906_init(void);

s8  GU906_Module_State(void);

s8  GU906_TCP_Socket(struct Gprs_Config *GprsCon);

s8  GU906_DTU_Socket(struct Gprs_Config *GprsCon);

s8  GU906_GPRS_write(char* pdat, int len);

u32 GU906_GPRS_read(char *pout, int len);

s8  GU906_make_phone(char *phone);

s8  GU906_Answer_Phone(u32 Delay);

s8  GU906_end_phone(void);

s8  GU906_DtuOrAT(u8 type);

#endif

main.c

#include #include #include "stdio.h"

#include "delay.h"

#include "GU906.h"

#include "config.h"

#include "usart1.h"

#include "usart4.h"

int main(void)

{

u32 ret = 0;

char buff[200]="";

struct Gprs_Config GprsCon;

delay_init();

usart4_Configuration(115200);    //GU900默认通信波特率是115200

usart1_Configuration(115200);    //调试输出端口波特率设置

delay_s(5);                      //刚上电 要等待10秒,等待GU906模块初始化完成

printf("\r\nBegin...\r\n");

GprsCon.server_ip = (u8 *)"210.66.59.211"; //GPRS通信时的服务器IP

GprsCon.server_port = atoi("8888");        //GPRS通信时的服务器端口

//GSM初始化

while(1)

{

if(_ATOK == GU906_init()){

printf("GU906 init ok.\r\n\r\n");

break;

}

printf("init error.\r\n");

delay_s(1);

}

/*****************************************************************************/

//GU906 GPRS TCP 非透传模式通信测试

while(1)

{

if(_ATOK == GU906_TCP_Socket(&GprsCon))

{

printf("socket ok\r\n\r\n");

delay_s(3);

while(1)

{

ret = GU906_GPRS_read(buff, 200);

if(ret)

{

printf("GPRS:[%d][%s]\r\n", ret,buff);

if(_ATOK != GU906_GPRS_write((char *)"OK", 2))

{

printf("Send Error.\r\n");

}

}

}

}

printf("GU906_TCP_Socket ERROR.\r\n");

while(1);

}

/*******************************************************************************/

/*****************************************************************************/

//GU906 GPRS TCP 透传模式通信测试

while(1)

{

if(_ATOK == GU906_DTU_Socket(&GprsCon))

{

printf("socket ok\r\n\r\n");

delay_s(3);

while(1)

{

ret = GU906_GPRS_read(buff, 200);

if(ret)

{

printf("GPRS:[%d][%s]\r\n", ret,buff);

if(_ATOK != GU906_GPRS_write((char *)buff, ret))

{

printf("Send Error.\r\n");

}

if(strstr(buff,"CLOSE"))

{

GU906_DtuOrAT(0);

}

if(strstr(buff,"OPEN"))

{

GU906_DtuOrAT(1);

}

}

}

}

printf("GU906_TCP_Socket ERROR.\r\n");

while(1);

}

/*******************************************************************************/

/*****************************************************************************/

//发送短信测试

while(_ATOK != GU906_Chinese_text("18750******", "123abd 测试"))

{

delay_s(5);

}

//接收短信测试

while(1)

{

if(0 == GU906_Read_UserSMS())

{

printf("------------------------------\r\n");

printf("号码:%s\r\n",sim.phone);

printf("设备:%s\r\n",sim.dev);

printf("时间:%s\r\n",sim.date);

printf("信息:%s\r\n",sim.data);

}

delay_ms(50);

}

/******************************************************************************/

/*****************************************************************************/

//打电话测试

if (_ATOK == GU906_make_phone("18750******"))

{

//等待接听

while(_ATOTIME == GU906_Answer_Phone(1000))

{

printf("make ok\r\n");

GU906_end_phone();

}

printf("make ok\r\n");

}

else

{

printf("make error\r\n");

//SoftReset();

}

ipcfg报错_静态局部变量和静态全程变量static。相关推荐

  1. 静态局部变量和静态全程变量static。

    1. 什么是static? static 是 C/C++ 中很常用的修饰符,它被用来控制变量的存储方式和可见性. 1.1 static 的引入 我们知道在函数内部定义的变量,当程序执行到它的定义处时, ...

  2. C语言局部变量、全局变量、静态局部变量、静态全局变量

    建立三个文件,文件名分别为main.c \ head1.c \  head2.c main.c #include<stdio.h> #include<stdlib.h> #in ...

  3. C语言基础入门48篇_44_静态局部变量、静态全局变量、静态函数(静态局部变量只被初始化一次,保留变量值、静态全局变量是加了作用域的全局变量、静态函数亦是加了作用域的函数)

    static关键字 C语言中的static关键字,有多种用法,它可以用来修饰局部变量.全局变量和函数,分别得到静态局部变量.静态全局变量和静态函数. 1. 静态局部变量 普通局部变量,函数每调用一次就 ...

  4. 局部变量,全局变量(外部变量),静态局部变量,静态全局变量

    今天被问到了一个问题:如何让请求的类延迟释放 如果要延迟释放或者在程序整个生命周期都存在可以考虑两种方式,一是定义一个静态变量,二是用单例.用单例本质上用的是静态变量. 单例的写法如下: + (ins ...

  5. flutter 真机无法调试 sdk报错_老许,你要转Flutter不要?只要你开金口,面试题现在就给你送来...

    概述 Flutter是Google推出的一套开源跨平台UI框架,可以快速地在Android.iOS和Web平台上构建高质量的原生用户界面.在过去的一年里,Flutter的更新频率是相当的快,也有很多的 ...

  6. 关于静态局部变量与静态外部变量

    静态局部变量特点:static int a 1:静态局部变量存储在静态存储区,如果赋有初值,函数调用期间只赋值一次,下次调用该函数时,静态局部变量值为上次调用之后的结果,原因:静态局部变量在函数调用期 ...

  7. 闪退没由报错_秉承工匠精神,3步定位飞桨报错原因,你也来试试?

    点击左上方蓝字关注我们 [故事的开始-]小张是一名AI算法攻城狮,听闻飞桨乃国产开源深度学习框架之光,心想炎黄子孙当自强,用自己的深度学习框架,实现中国的AI梦--他尝试在的笔记本上使用飞桨搭建线性回 ...

  8. 中引入文件报错_关于前端开发中的模块化

    前端开发离不开模块化,与模块化有关的关键字有以下几个: require/module.exports export/import define/require/exprots define/seajs ...

  9. th:text为null报错_为vue3.0的学习TS解读高级类型

    知识点摘要 本节课主要关键词为: 自动类型推断 / 类型断言 / 类型别名(type) / 映射类型(Pick/Record等...) / 条件类型(extends) / 类型推断(infer) 自动 ...

最新文章

  1. 进展 | 密集人群分布检测与计数
  2. 盘点 | 2018全球人工智能突破性技术TOP10(附报告)
  3. garch预测 python_【2019年度合辑】手把手教你用Python做股票量化分析
  4. 计算机二级web前端,web前端:原生js之Math对象
  5. 关于《设计模式演练》系列文章结构的规范
  6. getContextPath、getServletPath、getRequestURI的区别
  7. Get Requests with Json Data Get Requests with Url Parameters
  8. Nature拳头综述(IF=71)| 上海科技大学钟超等人系统介绍合成生物学及未来潜在应用...
  9. 浅谈Base64编码[转]
  10. Xilinx FPGA芯片命名规则
  11. 油猴(Tampermonkey)使用教程
  12. 社区垃圾分类AI盒子
  13. linux清理根目录下的垃圾,Linux 根目录满了解决方法
  14. ps读写ddr3里面的数据 zynq_DDR3读写数据调试
  15. Kubernetes--学习笔记-4-Kubernetes 集群搭建过程中常用命令
  16. #书籍《量子力学》读后感
  17. 一姐们知道她老公外面有小三后,不但没哭没闹,反而对她老公特别好
  18. 《GEB-EGB》-人工智能
  19. 每日刷题记录 (二十七)
  20. PGA Tour PRize Money(Uva 207)

热门文章

  1. event对象的一些方法(取消冒泡,阻止默认行为)
  2. 单页面vue使用webwork
  3. eclipse java 测试_java-在Eclipse中“未找到JUnit测试”
  4. ReactNative数组操作
  5. H5历史API之pushstate
  6. Android 11上游戏签名需要注意的问题(是否包含V2签名)
  7. i5 11400f和r5 3600xt哪个好
  8. R-CNN系列论文综述
  9. 解决Google浏览器打开黑屏
  10. 小嘿嘿之目标检测关键小技术focal loss/DCN/ROI Align/FPN