⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 moto.cpp

📁 采用cb平台开以
💻 CPP
📖 第 1 页 / 共 2 页
字号:
#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 + -