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

📄 gprs080228.c

📁 通过车载终端采集GPS数据
💻 C
📖 第 1 页 / 共 2 页
字号:

#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 + -