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

📄 at_cmd.c

📁 在ARM7和UC/OSII的平台上实现了GPS自动报站的功能,涉及GPS模块LEA_4S的驱动,位置速寻算法,语音芯片ISD4004的录放音驱动,LED页面管理等等.从启动代码到操作系统的移植以及到业
💻 C
📖 第 1 页 / 共 4 页
字号:
/****************************************************************
**                                                              *
**  FILE         :  AT_CMD.C                                    *
**  COPYRIGHT    :  (c) 2001 .Xiamen Yaxon NetWork CO.LTD       *
**                                                              *
**                                                              *
**  By : CCH 2002.1.15                                          *
****************************************************************/
#define  ATCMD_GLOBALS

#include "includes.h"
#include "bsp.h"
#include "tools.h"
#include "stream.h"
#include "at_cmd.h"


static STREAM tmpstrm;



/*********************************************************************************
**                                                                               *
**                                                                               *
**                 AT Commands handler function                                  *
**                                                                               *
**                                                                               *
*********************************************************************************/

/*
********************************************************************************
* Handler:  Common AT Commands
********************************************************************************
*/
static INT16S Handler_Common(INT8U *recvbuf, INT16U len, ATCMDACK_STRUCT *ATCmdAck)
{
    ATCmdAck = ATCmdAck;

    if (SearchKeyWord(recvbuf, len, "OK"))
        return AT_SUCCESS;
    else
        return AT_FAILURE;
}

/*
********************************************************************************
* Handler:  ATD ------ Dial non_voice call
********************************************************************************
*/
static INT16S Handler_ATD_DATA(INT8U *recvbuf, INT16U len, ATCMDACK_STRUCT *ATCmdAck)
{
    ATCmdAck = ATCmdAck;

    if (SearchKeyWord(recvbuf, len, "CONNECT"))
        return AT_SUCCESS;
    else
        return AT_FAILURE;
}

/*
********************************************************************************
* Handler:  AT+CSQ ------ Signal Quality
********************************************************************************
*/
static INT16S Handler_AT_CSQ(INT8U *recvbuf, INT16U len, ATCMDACK_STRUCT *ATCmdAck)
{
    if (SearchKeyWord(recvbuf, len, "+CSQ")) {
        ATCmdAck->ackbuf[0] = SearchDigitalString(recvbuf, len, ',', 1);
        ATCmdAck->ackbuf[1] = SearchDigitalString(recvbuf, len, CR,  1);
        return AT_SUCCESS;
    } else {
        return AT_FAILURE;
    }
}

/*
********************************************************************************
* Handler:  AT+CREG? ------ NetWork Registration
********************************************************************************
*/
static INT16S Handler_AT_R_CREG(INT8U *recvbuf, INT16U len, ATCMDACK_STRUCT *ATCmdAck)
{
    INT8U temp;

    if (SearchKeyWord(recvbuf, len, "+CREG")) {
        ATCmdAck->ackbuf[0] = SearchDigitalString(recvbuf, len, ',', 1);
        temp                = SearchDigitalString(recvbuf, len, ',', 2);
        if (temp == 0xff) {
            ATCmdAck->ackbuf[1] = SearchDigitalString(recvbuf, len, CR, 1);
            ATCmdAck->ackbuf[2] = 0xff;
            ATCmdAck->ackbuf[3] = 0xff;
        } else {
            ATCmdAck->ackbuf[1] = temp;
            ATCmdAck->ackbuf[2] = SearchDigitalString(recvbuf, len, ',', 3);
            ATCmdAck->ackbuf[3] = SearchDigitalString(recvbuf, len, CR,  1);
        }
        return AT_SUCCESS;
    } else {
        return AT_FAILURE;
    }
}

/*
********************************************************************************
* Handler:  AT+CSMS ----- Select Message Service
********************************************************************************
*/
static INT16S Handler_AT_CSMS(INT8U *recvbuf, INT16U len, ATCMDACK_STRUCT *ATCmdAck)
{
    if (ATCmdAck->numEC == 1) {
        if (SearchKeyWord(recvbuf, len, "ERROR")) return AT_FAILURE;
    } else if (ATCmdAck->numEC == 2) {
        if (SearchKeyWord(recvbuf, len, "OK")) return AT_SUCCESS;
        else return AT_FAILURE;
    }
    return -1;
}

/*
********************************************************************************
* Handler:  AT+CNMI? ----- Query New SMS message indications
********************************************************************************
*/
static INT16S Handler_AT_R_CNMI(INT8U *recvbuf, INT16U len, ATCMDACK_STRUCT *ATCmdAck)
{
    if (ATCmdAck->numEC == 1) {
        if (SearchKeyWord(recvbuf, len, "ERROR")) {
            return AT_FAILURE;
        } else {
            ATCmdAck->ackbuf[0] = SearchDigitalString(recvbuf, len, ',', 1);
            ATCmdAck->ackbuf[1] = SearchDigitalString(recvbuf, len, ',', 2);
            ATCmdAck->ackbuf[2] = SearchDigitalString(recvbuf, len, ',', 3);
            ATCmdAck->ackbuf[3] = SearchDigitalString(recvbuf, len, ',', 4);
            ATCmdAck->ackbuf[4] = SearchDigitalString(recvbuf, len, CR,  1);
        }
    } else if (ATCmdAck->numEC == 2) {
        return AT_SUCCESS;
    }
    return -1;
}

/*
********************************************************************************
* Handler:  AT+CMGS_PDU
********************************************************************************
*/
static INT16S Handler_AT_CMGS_PDU(INT8U *recvbuf, INT16U len, ATCMDACK_STRUCT *ATCmdAck)
{
    ATCmdAck = ATCmdAck;
    if (SearchKeyWord(recvbuf, len, "ERROR")) {
        return AT_FAILURE;
    } else {
        return AT_SUCCESS;
    }
}

/*
********************************************************************************
* Handler:  AT^SCKS? ----- Quuery SIM connection status
********************************************************************************
*/
static INT16S Handler_AT_R_SCKS(INT8U *recvbuf, INT16U len, ATCMDACK_STRUCT *ATCmdAck)
{
    #if GSM_BENQ
    if (SearchKeyWord(recvbuf, len, "+CPIN:")) {
    	if(SearchKeyWord(recvbuf, len, "READY"))  ATCmdAck->ackbuf[1]=1;
    	else ATCmdAck->ackbuf[1]=0;
    	return AT_SUCCESS;
    }else {
    	return AT_FAILURE;
    }
    #else
    if (SearchKeyWord(recvbuf, len, "^SCKS")) {
        ATCmdAck->ackbuf[0] = SearchDigitalString(recvbuf, len, ',', 1);
        ATCmdAck->ackbuf[1] = SearchDigitalString(recvbuf, len, CR,  1);
        return AT_SUCCESS;
    } else {
        return AT_FAILURE;
    }
    #endif
}

/*
********************************************************************************
* Handler:  AT+CCFC ----- Query call forwarding number and condition status
********************************************************************************
*/
static INT16S Handler_AT_R_CCFC(INT8U *recvbuf, INT16U len, ATCMDACK_STRUCT *ATCmdAck)
{
    INT8U temp;

    if (SearchKeyWord(recvbuf, len, "ERROR")) {
        return AT_FAILURE;
    } else if (SearchKeyWord(recvbuf, len, "OK")) {
        return AT_SUCCESS;
    } else if (SearchKeyWord(recvbuf, len, "+CCFC")) {
        temp = SearchDigitalString(recvbuf, len, ',', 2);
        if (temp == 0xff) temp = SearchDigitalString(recvbuf, len, CR, 1);
        if (temp == 1) ATCmdAck->ackbuf[0] = SearchDigitalString(recvbuf, len, ',', 1);
    } else if (ATCmdAck->numEC > 4) {
        return AT_FAILURE;
    }
    return -1;
}

#if GSM_BENQ
/*
********************************************************************************
* Handler:  AT+DATE=? ----- Read Real Time Clock
********************************************************************************
*/
static INT16S Handler_AT_R_DATE(INT8U *recvbuf, INT16U len, ATCMDACK_STRUCT *ATCmdAck)
{
    if (SearchKeyWord(recvbuf, len, "ERROR")) {
        return AT_FAILURE;
    } else {
        ATCmdAck->ackbuf[0] = SearchDigitalString(recvbuf, len, '/', 1);
        ATCmdAck->ackbuf[1] = SearchDigitalString(recvbuf, len, '/', 2);
        ATCmdAck->ackbuf[2] = SearchDigitalString(recvbuf, len, CR,  1);

        return AT_SUCCESS;
    }
}
static INT16S Handler_AT_R_TIME(INT8U *recvbuf, INT16U len, ATCMDACK_STRUCT *ATCmdAck)
{

    if (SearchKeyWord(recvbuf, len, "ERROR")) {
        return AT_FAILURE;
    } else {
        ATCmdAck->ackbuf[0] = SearchDigitalString(recvbuf, len, '/', 1);
        ATCmdAck->ackbuf[1] = SearchDigitalString(recvbuf, len, '/', 2);
        ATCmdAck->ackbuf[2] = SearchDigitalString(recvbuf, len, CR,  1);

        return AT_SUCCESS;
    }
}
#if 0
static INT16S Handler_AT_ATH(INT8U *recvbuf, INT16U len, ATCMDACK_STRUCT *ATCmdAck)
{
    ATCmdAck = ATCmdAck;
    if (SearchKeyWord(recvbuf, len, "OK")) {
        return AT_SUCCESS;
    }
    else return  AT_FAILURE;
}
#endif
#else
/*
********************************************************************************
* Handler:  AT+CCLK? ----- Read Real Time Clock
********************************************************************************
*/
static INT16S Handler_AT_R_CCLK(INT8U *recvbuf, INT16U len, ATCMDACK_STRUCT *ATCmdAck)
{
    if (SearchKeyWord(recvbuf, len, "ERROR")) {
        return AT_FAILURE;
    } else {
        ATCmdAck->ackbuf[0] = SearchDigitalString(recvbuf, len, '/', 1);
        ATCmdAck->ackbuf[1] = SearchDigitalString(recvbuf, len, '/', 2);
        ATCmdAck->ackbuf[2] = SearchDigitalString(recvbuf, len, ',', 1);
        ATCmdAck->ackbuf[3] = SearchDigitalString(recvbuf, len, ':', 2);
        ATCmdAck->ackbuf[4] = SearchDigitalString(recvbuf, len, ':', 3);
        ATCmdAck->ackbuf[5] = SearchDigitalString(recvbuf, len, '"', 2);
        return AT_SUCCESS;
    }
}
#endif
/*
********************************************************************************
* Handler:  AT+CLCC ----- List current calls of ME
********************************************************************************
*/
static INT16S Handler_AT_CLCC(INT8U *recvbuf, INT16U len, ATCMDACK_STRUCT *ATCmdAck)
{
    INT8U temp1, temp2;

    if (ATCmdAck->numEC == 1) ATCmdAck->ackbuf[0] = FALSE;
    if (SearchKeyWord(recvbuf, len, "OK")) {
        return AT_SUCCESS;
    } else {
        if (SearchKeyWord(recvbuf, len, "+CLCC:")) {
            temp1 = SearchDigitalString(recvbuf, len, ',', 2);
            temp2 = SearchDigitalString(recvbuf, len, ',', 3);
            if (temp1 == 1 && temp2 == 4) ATCmdAck->ackbuf[0] = TRUE;
        }
        return -1;
    }
}

static INT16S Handler_R_Autocampon(INT8U *recvbuf, INT16U len, ATCMDACK_STRUCT *ATCmdAck)
{
    if (SearchKeyWord(recvbuf, len, "ERROR")) {
        return AT_FAILURE;
    } else {
        ATCmdAck->ackbuf[0] = SearchDigitalString(recvbuf, len,  CR, 1); 
        return AT_SUCCESS;
    }
     
}
#if GSM_BENQ
#else
/*
*************************************************************************
Handler: ATI
*************************************************************************
*/
static INT16S Handler_AT_R_ATI(INT8U *recvbuf, INT16U len, ATCMDACK_STRUCT *ATCmdAck)
{
    ATCmdAck = ATCmdAck;

    if (SearchKeyWord(recvbuf, len, "ERROR")) {
        return AT_FAILURE;
    }
    else if (SearchKeyWord(recvbuf, len, "OK"))
    {
       if((SearchKeyWord(recvbuf, len, "MC35i"))||(SearchKeyWord(recvbuf, len, "MC35I")))
       {
          SetIsMC35i(TRUE);
       }
       else SetIsMC35i(FALSE);
       return AT_SUCCESS;
    }
    else    return -1;
}
#endif


/*********************************************************************************
**                                                                               *
**                                                                               *
**                 AT Commands parameters                                        *
**                                                                               *
**                                                                               *
*********************************************************************************/
/*
typedef struct {
    INT8U       status;                                             // command status
    INT8U       overtime;                                           // overflow time ( UNIT = SECOND )
    INT8U       nsEC;                                               // number of END'S characters(send)
    INT8U       naEC;                                               // number of END'S characters(ack)
    INT8U (*handler)(INT8U *, INT16U, ATCMDACK_STRUCT *);           // command handler
} ATCMDPARA_STRUCT;
*/

/*
********************************************************************************
* Standard V.25ter AT Commands
********************************************************************************
*/
ATCMDPARA_STRUCT AT_TEST_PARA            =      { 0,                2,      1,      1,      Handler_Common      };
ATCMDPARA_STRUCT AT_ECHO_PARA            =      { 0,                4,      1,      1,      Handler_Common      };
#if GSM_BENQ
ATCMDPARA_STRUCT AT_ATH_PARA             =      { 0,                4,      1,      1,      Handler_Common         };

#else
ATCMDPARA_STRUCT AT_ATH_PARA             =      { 0,                4,      1,      1,      Handler_Common      };
#endif
ATCMDPARA_STRUCT AT_ATA_PARA             =      { 0,                4,      1,      1,      Handler_Common      };
ATCMDPARA_STRUCT AT_ATD_PARA             =      { 0,              120,      1,      1,      Handler_Common      };
ATCMDPARA_STRUCT AT_ATD_DATA_PARA        =      { 0,              120,      1,      1,      Handler_ATD_DATA    };
ATCMDPARA_STRUCT AT_IPR_PARA             =      { 0,                4,      1,      1,      Handler_Common      };


/*
********************************************************************************
* AT Commands originating from GSM 07.07
********************************************************************************
*/
ATCMDPARA_STRUCT AT_VTS_PARA             =      { 0,                4,      1,      1,      Handler_Common      };
ATCMDPARA_STRUCT AT_CLIP_PARA            =      { 0,                4,      1,      1,      Handler_Common      };
ATCMDPARA_STRUCT AT_CSQ_PARA             =      { 0,                4,      1,      2,      Handler_AT_CSQ      };
ATCMDPARA_STRUCT AT_CREG_PARA            =      { 0,                4,      1,      1,      Handler_Common      };
ATCMDPARA_STRUCT AT_R_CREG_PARA          =      { ATCMD_SUSPENDRECV,4,      1,      1,      Handler_AT_R_CREG   };
ATCMDPARA_STRUCT AT_CCFC_PARA            =      { 0,               10,      1,      1,      Handler_Common      };
ATCMDPARA_STRUCT AT_R_CCFC_PARA          =      { ATCMD_INSANT,    10,      1,      0,      Handler_AT_R_CCFC   };
ATCMDPARA_STRUCT AT_CGDCONT_PARA         =      { 0,                4,      1,      1,      Handler_Common      };
#if GSM_BENQ
ATCMDPARA_STRUCT AT_CMUX_PARA            =      { 0,                4,      0,      1,      Handler_Common      };

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -