📄 moto.cpp
字号:
#include <vcl.h>
#pragma hdrstop
/*
问题:
2008.04.08 - 如何知道串口状态(如是否已打开,是否正在忙...)?
历史:
2007.11.23 - 修改 M_NetDial();
2008.02.03 - 修改 M_NetConn(),让在发出打开指令后,一定要等到OPEN或ERROR或掉线信息;
2008.03.12 - 去掉可能导致死循环的WHILE语句;
2008.03.13 - 改为中断方式收发后修改各个语句的接收逻辑;
2008.04.08 - TODO: 修改为把超时故障垂直返回给用户,并提供一个发AT给模块检查模块能否响应的函数;
. 修改 ComRcvPck();
.
*/
#include "UartPort.h"
#include "s_net.h"
#include "GPRSNet.h"
#include "endebug.h"
#include "stdarg.h"
#include "stdio.h"
#include "stdarg.h"
#include "string.h"
#ifdef MOTO_GPRS
#define ONESEC (1024)
extern struct S_NetInfo gNet;
//////////////////////////////////////////////////////////////////////////
//#define M_NetCheckPPP M_NetCheckOnLine
//////////////////////////////////////////////////////////////////////////
unsigned char M_NetCheckConn(void);
unsigned char M_NetCheckLink(void);
unsigned char M_CheckResp(unsigned char *buf);
static unsigned short lp_out=0,lp_end=0;
#define StTick GetTickCount()
#define CHECKNUM 3
/*******************************************************************************
** name: CdmaSendPck
** function: 通讯串口发送数据
** parameter: buf 待发送数据 len发送长度
** ret: 0 -- 成功
** modify:
** comment:
********************************************************************************/
//------------------------------------------------------------------------------
unsigned char ComRcvPck(unsigned char *rxbuf,unsigned short len,unsigned char *rspbuf, unsigned int ms)
{
unsigned int re;
re=CdmaRcvPck(rxbuf,len,ms,GPRS_COM);
if (!re)
{
return N_RESULT_RECVTIMEOUT;
}
if (strstr((char *)rxbuf, (char *)rspbuf))
{
return N_RESULT_SUCCESS; //OK
}
else
{
re=M_CheckResp(rxbuf);
if (re!=N_RESULT_SUCCESS)
return re;
return N_RESULT_ERR;
}
}
//////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////
//查看响应串中是否有:stat 1:1, ERROR, ...
unsigned char M_CheckResp(unsigned char *buf)
{
unsigned char *p=NULL;
p=strstr((char *)buf, "+MIPSTAT: 1,");
if (p!=NULL) {
return N_RESULT_GETSTAT;
}
p=strstr((char *)buf, "ERROR");
if (p!=NULL) {
return N_RESULT_GETERROR;
}
//ADD to no GPRS reg
p=strstr((char *)buf, "+CGREG: 002");
if (p!=NULL) {
return N_RESULT_GPRSNOTREG;
}
return N_RESULT_SUCCESS;
}
//////////////////////////////////////////////////////////////////////////
unsigned char M_NetInit(void)
{
char cmd[40],re,i,attflag;
unsigned char rxbuf[128];
char *tempstr;
unsigned int CrTickConut;
lp_end = 0;
lp_out = 0;
//---------------------------------------------
for (i=0;i<20;i++)
{
memset(cmd,0,sizeof(cmd));
tempstr="AT\r\n";
memcpy(cmd,tempstr,strlen(tempstr));
CdmaSendPck(cmd,strlen(cmd));
memset(rxbuf,0,sizeof(rxbuf));
re=ComRcvPck(rxbuf, 100, "OK", 1000);
if (re!=N_RESULT_SUCCESS)
{
DelayMs(1000);
continue;
}
break;
}
if (i==20)
return re;
//*
attflag=0;
CrTickConut=StTick;
while(StTick-CrTickConut<15000)
{
memset(cmd,0,sizeof(cmd));
tempstr="AT+CGATT?\r\n";
memcpy(cmd,tempstr,strlen(tempstr));
CdmaSendPck(cmd,strlen(cmd));
memset(rxbuf,0,sizeof(rxbuf));
re = CdmaRcvPck(rxbuf,128,1*ONESEC,GPRS_COM);
if (strstr((char*)rxbuf,"+CGATT, 0")!=NULL)
{
DelayMs(1000);
continue;
}
if (strstr((char*)rxbuf,"+CGATT: 1")!=NULL)
{
attflag=1;
break;
}
if (strstr((char*)rxbuf,"OK")!=NULL)
{
DelayMs(1000);
continue;
}
}
DebugPrint("AT+CGATT?\r\n");
DebugPrint(rxbuf);
DebugPrint("\r\n");
//---------------------------------------------
DebugPrint("attflag=%d\r\n",attflag);
if (attflag==0)
return N_RESULT_GPRSNOTREG;
//*/
/*
memset(cmd,0,sizeof(cmd));
tempstr="ATH\r\n";
memcpy(cmd,tempstr,strlen(tempstr));
CdmaSendPck(cmd,strlen(cmd));
memset(rxbuf,0,sizeof(rxbuf));
re=ComRcvPck(rxbuf, 100, "OK", 500);
if (re!=N_RESULT_SUCCESS)
return re;
*/
memset(cmd,0,sizeof(cmd));
tempstr="AT&F0\r\n";
memcpy(cmd,tempstr,strlen(tempstr));
CdmaSendPck(cmd,strlen(cmd));
memset(rxbuf,0,sizeof(rxbuf));
re=ComRcvPck(rxbuf, 100, "OK", 500);
if (re!=N_RESULT_SUCCESS)
return re;
memset(cmd,0,sizeof(cmd));
tempstr="ATZ0\r\n";
memcpy(cmd,tempstr,strlen(tempstr));
CdmaSendPck(cmd,strlen(cmd));
memset(rxbuf,0,sizeof(rxbuf));
re=ComRcvPck(rxbuf, 100, "OK", 500);
if (re!=N_RESULT_SUCCESS)
return re;
memset(cmd,0,sizeof(cmd));
tempstr="ATZ\r\n";
memcpy(cmd,tempstr,strlen(tempstr));
CdmaSendPck(cmd,strlen(cmd));
memset(rxbuf,0,sizeof(rxbuf));
re=ComRcvPck(rxbuf, 100, "OK", 500);
if (re!=N_RESULT_SUCCESS)
return re;
memset(cmd,0,sizeof(cmd));
tempstr="ATE0\r\n";
memcpy(cmd,tempstr,strlen(tempstr));
CdmaSendPck(cmd,strlen(cmd));
memset(rxbuf,0,sizeof(rxbuf));
re=ComRcvPck(rxbuf, 100, "OK", 500);
if (re!=N_RESULT_SUCCESS)
return re;
memset(cmd,0,sizeof(cmd));
tempstr="AT&K0\r\n";
memcpy(cmd,tempstr,strlen(tempstr));
CdmaSendPck(cmd,strlen(cmd));
memset(rxbuf,0,sizeof(rxbuf));
re=ComRcvPck(rxbuf, 100, "OK", 500);
if (re!=N_RESULT_SUCCESS)
return re;
memset(cmd,0,sizeof(cmd));
tempstr="at+mipconf=1,5,5,300,10\r\n";
memcpy(cmd,tempstr,strlen(tempstr));
CdmaSendPck(cmd,strlen(cmd));
memset(rxbuf,0,sizeof(rxbuf));
re=ComRcvPck(rxbuf, 100, "OK", 500);
if (re!=N_RESULT_SUCCESS)
return re;
memset(cmd,0,sizeof(cmd));
tempstr="AT+CREG?\r\n";
memcpy(cmd,tempstr,strlen(tempstr));
CdmaSendPck(cmd,strlen(cmd));
memset(rxbuf,0,sizeof(rxbuf));
re=ComRcvPck(rxbuf, 100, "OK", 500);
if (strstr((char *)rxbuf, "ERROR"))
return N_RESULT_GETERROR;
if (strstr((char *)rxbuf, "+CREG:")==NULL)
return N_RESULT_GETERROR;
if (strstr((char *)rxbuf, "000,002")!=NULL)
return N_RESULT_GPRSNOTREG;
if (strstr((char *)rxbuf, "000,001")==NULL)
return N_RESULT_GPRSNOTREG;
if (re!=N_RESULT_SUCCESS)
return re;
/*
memset(cmd,0,sizeof(cmd));
tempstr="AT+CGREG?\r\n";
memcpy(cmd,tempstr,strlen(tempstr));
CdmaSendPck(cmd,strlen(cmd));
memset(rxbuf,0,sizeof(rxbuf));
re=ComRcvPck(rxbuf, 100, "OK", 500);
if (strstr((char *)rxbuf, "ERROR"))
return N_RESULT_GETERROR;
if (strstr((char *)rxbuf, "+CGREG:")==NULL)
return N_RESULT_GETERROR;
if (strstr((char *)rxbuf, "000,002")!=NULL)
return N_RESULT_GPRSNOTREG;
if (strstr((char *)rxbuf, "000,001")==NULL)
return N_RESULT_GPRSNOTREG;
if (re!=N_RESULT_SUCCESS)
return re;
*/
memset(cmd,0,sizeof(cmd));
tempstr="at+cmee=2\r\n";
memcpy(cmd,tempstr,strlen(tempstr));
CdmaSendPck(cmd,strlen(cmd));
memset(rxbuf,0,sizeof(rxbuf));
re=ComRcvPck(rxbuf, 100, "OK", 500);
if (re!=N_RESULT_SUCCESS)
return re;
memset(cmd,0,sizeof(cmd));
tempstr="AT+CLIP=1\r\n";
memcpy(cmd,tempstr,strlen(tempstr));
CdmaSendPck(cmd,strlen(cmd));
memset(rxbuf,0,sizeof(rxbuf));
re=ComRcvPck(rxbuf, 100, "OK", 500);
if (re!=N_RESULT_SUCCESS)
return re;
memset(cmd,0,sizeof(cmd));
tempstr="AT+CNMI=0,1,0,0,0\r\n";
memcpy(cmd,tempstr,strlen(tempstr));
CdmaSendPck(cmd,strlen(cmd));
memset(rxbuf,0,sizeof(rxbuf));
re=ComRcvPck(rxbuf, 100, "OK", 500);
if (re!=N_RESULT_SUCCESS)
return re;
memset(cmd,0,sizeof(cmd));
tempstr="AT+CMGF=1\r\n";
memcpy(cmd,tempstr,strlen(tempstr));
CdmaSendPck(cmd,strlen(cmd));
memset(rxbuf,0,sizeof(rxbuf));
re=ComRcvPck(rxbuf, 100, "OK", 500);
if (re!=N_RESULT_SUCCESS)
return re;
memset(cmd,0,sizeof(cmd));
tempstr="AT+CGPRS?\r\n";
memcpy(cmd,tempstr,strlen(tempstr));
CdmaSendPck(cmd,strlen(cmd));
memset(rxbuf,0,sizeof(rxbuf));
re=ComRcvPck(rxbuf, 100, "OK", 500);
if (re!=N_RESULT_SUCCESS)
return re;
/*
CdmaSendPck("AT+MIPSETS=342\r\n", 14);
memset(rxbuf,0,sizeof(rxbuf));
re = CdmaRcvPck(rxbuf,128,2*ONESEC,GPRS_COM);
//if (strstr((char*)rxbuf,"OK")!=NULL)
// continue;
*/
//---------------------------------------------
return N_RESULT_SUCCESS;
}
//////////////////////////////////////////////////////////////////////////
//复位GPRS,复位后需要暂停6~8秒才能继续做GPRS的操作
unsigned char M_NetReset(void)
{
unsigned char re,i;
unsigned char *p;
unsigned char rxbuf[60];
memset(rxbuf,0,sizeof(rxbuf));
CdmaSendPck("AT+MRST\r\n",9);
for (i=0;i<CHECKNUM;i++)
{
re=ComRcvPck(rxbuf, 100, "OK", 5*ONESEC);
if (re!=N_RESULT_SUCCESS) return re;
if (strstr((char*)rxbuf,"OK")!=NULL)
return N_RESULT_SUCCESS;
}
if (i==CHECKNUM)
return N_RESULT_NOTGETOK;
return N_RESULT_SUCCESS;
}
//取模块版本号
unsigned char M_NetGetVer(unsigned char *buf)
{
unsigned char *p, *q, len, re;
unsigned char rxbuf[60];
memset(rxbuf,0,sizeof(rxbuf));
CdmaSendPck("ati8\r\n",6);
re=ComRcvPck(rxbuf, 60, "OK", 4*ONESEC);
if (re!=N_RESULT_SUCCESS) return re;
p=(unsigned char *)strstr((char *)rxbuf, "G");
if (p!=NULL)
{
q=(unsigned char *)strstr((char *)(p+2), "\r\n");
if (p!=NULL && q!=NULL){
len=q-p;
} else {
len=18;
}
memcpy(buf, p, len);
return N_RESULT_SUCCESS;
} else {
re=ComRcvPck(rxbuf, 60, "G", 4*ONESEC);
if (re!=N_RESULT_SUCCESS) return re;
q=(unsigned char *)strstr((char *)(p+2), "\r\n");
if (p!=NULL && q!=NULL){
len=q-p;
} else {
len=18;
}
memcpy(buf, p, len);
return N_RESULT_SUCCESS;
}
return N_RESULT_ERR;
}
//拨号函数 0x01成功 0x00失败 ,从公网获取IP地址
unsigned char M_NetLink(unsigned char *PARAM)
{
unsigned int re;
unsigned int len,i;
unsigned char *q, *p;
unsigned char txbuf[128],rxbuf[128];
memset(txbuf,0,sizeof(txbuf));
memset(rxbuf,0,sizeof(rxbuf));
lp_end=0;
lp_out=0;
if (M_NetCheckLink() == N_RESULT_PPPOPENED) return N_RESULT_PPPOPENED;
strcpy(txbuf,"at+mipcall=1,");
strcat(txbuf,PARAM);
strcat(txbuf,"\r\n");
len=strlen((char*)txbuf);
CdmaSendPck(txbuf,len);
for (i=0;i<CHECKNUM;i++)
{
re = CdmaRcvPck(rxbuf,128,5*ONESEC,GPRS_COM);
if(!re) return N_RESULT_RECVTIMEOUT;
p = (unsigned char*)strstr((char*)rxbuf,"+MIPCALL: ");
q = (unsigned char*)strstr((char*)rxbuf,".");
if (p != NULL && q != NULL) return N_RESULT_PPPOPENED;
if (strstr((char*)rxbuf,"NO CARRIER")!=NULL)
{
return N_RESULT_PPPCLOSED;
}
if (strstr((char*)rxbuf,"+MIPCALL: 0")!=NULL)
{
return N_RESULT_PPPCLOSED;
}
re=M_CheckResp(rxbuf);
if (re!=N_RESULT_SUCCESS)
{
return re;
}
p = (unsigned char*)strstr((char*)rxbuf,"OK");
if (p == NULL) return N_RESULT_NOTGETOK;
}
return N_RESULT_RECVINVALID;
}
//关闭与应用后台的联接
unsigned char M_NetCloseConn(void)
{
unsigned int re,i;
unsigned char rxbuf[128];
lp_end=0;
lp_out=0;
memset(rxbuf,0,sizeof(rxbuf));
if (M_NetCheckConn() == N_RESULT_TCPCLOSED) return N_RESULT_SUCCESS;
CdmaSendPck("at+mipclose=1\r\n",15);
memset(rxbuf,0,128);
for (i=0;i<4;i++)
{
re = CdmaRcvPck(rxbuf,64,10*ONESEC,GPRS_COM);
if (!re)
{
CdmaSendPck("at+mipclose=1\r\n",15);
memset(rxbuf,0,128);
continue;
}
if (strstr((char *)rxbuf,"+MIPCLOSE: 1,3")!=NULL)
return N_RESULT_SUCCESS;
if (strstr((char *)rxbuf,"+MIPCLOSE: 1,2")!=NULL)
return N_RESULT_SUCCESS;
if (strstr((char *)rxbuf,"+MIPCLOSE: 1,1")!=NULL)
return N_RESULT_SUCCESS;
if (strstr((char *)rxbuf,"+MIPCLOSE: 1,0")!=NULL)
return N_RESULT_SUCCESS;
if (strstr((char *)rxbuf,"ERROR")!=NULL)
return N_RESULT_GETERROR;
if (strstr((char *)rxbuf,"OK")==NULL)
{
//return N_RESULT_NOTGETOK;
continue;
}
}
return N_RESULT_RECVTIMEOUT;
}
//断开与公网的联接
unsigned char M_NetCloseLink(void)
{
unsigned int re,i;
unsigned char rxbuf[129];
lp_end=0;
lp_out=0;
re=M_NetCheckLink();
if (re==N_RESULT_PPPCLOSED) return N_RESULT_SUCCESS;
else if (re!=N_RESULT_PPPOPENED) return re;
memset(rxbuf,0,sizeof(rxbuf));
CdmaSendPck("AT+MIPCALL=0\r", 13);
for (i=0;i<4;i++)
{
re = CdmaRcvPck(rxbuf,128,8*ONESEC,GPRS_COM);
if (!re)
{
CdmaSendPck("AT+MIPCALL=0\r\n",15);
memset(rxbuf,0,129);
continue;
}
//if (!re)
// return N_RESULT_RECVTIMEOUT;
if (strstr((char *)rxbuf, "+MIPCALL: 0") !=NULL) return N_RESULT_SUCCESS;
if (strstr((char *)rxbuf, "ERROR")!=NULL) return N_RESULT_ERR;
if (strstr((char *)rxbuf,"OK")==NULL) continue; //return N_RESULT_NOTGETOK;
}
return N_RESULT_RECVINVALID;
}
// mode 1: 关闭所有连接
// 0: 关闭当前TCP连接
unsigned char M_NetClose(unsigned char mode)
{
switch (mode)
{
default:
return N_RESULT_ERR;
case 0:
return M_NetCloseConn();
case 1:
return M_NetCloseLink();
}
}
//检测卡函数
// 0 -- 有卡 1--无卡
unsigned char M_NetCheckSim(void)
{
unsigned int ret,i;
unsigned char *p;
unsigned char rxbuf[60];
memset(rxbuf,0,sizeof(rxbuf));
CdmaSendPck("AT+CPIN?\r", 9);
for (i=0;i<3;i++)
{
ret = CdmaRcvPck(rxbuf, 32, 4*ONESEC, GPRS_COM);
if (!ret) return N_RESULT_RECVTIMEOUT;
p = (unsigned char*)strstr((char*)rxbuf,"+CPIN: READY");
if (p != NULL) return N_RESULT_SUCCESS;
}
return N_RESULT_RECVINVALID;
}
//检测信号函数
//正常返回信号强度,异常返回 0x00
unsigned char M_NetCheckSignal(void)
{
unsigned int re;
unsigned char *p;
unsigned int signum;
unsigned char rxbuf[60];
memset(rxbuf,0,sizeof(rxbuf));
CdmaSendPck("at+csq\r", 7);
re = CdmaRcvPck(rxbuf, 60, 3*ONESEC, GPRS_COM);
if(!re) return N_RESULT_ERR;
p = (unsigned char *)strstr((char *)rxbuf, "+CSQ:");
if (p == NULL) return N_RESULT_ERR;
p = p+6;
signum = atol((char *)p);
if (signum >= 32) return N_RESULT_ERR;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -