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

📄 main.c

📁 一个完整的MODEM例程
💻 C
📖 第 1 页 / 共 2 页
字号:
    {
        //while(1)
        //{
            //UART0_SendString((uint8 *)"执行命令错误\r\n");
            //DelayNS(10);
        //}
        RecPointer=ReadPointer=0;
        return 1;
    }
    
    sprintf(tempch,"AT#TCPSERV=2,\"%d.%d.%d.%d\"\r",ServerIP2[0],ServerIP2[1],ServerIP2[2],ServerIP2[3]);
    RecPointer=ReadPointer=0;                                //清除接受缓存区
    status=ModemCommand(tempch);   
    if(status!=MODEM_CONNECT)
    {
        //while(1)
        //{
            //UART0_SendString((uint8 *)"执行命令错误\r\n");
            //DelayNS(10);
        //}
        RecPointer=ReadPointer=0;
        return 1;
    }
    
    sprintf(tempch,"AT#TCPPORT=2,\"%d\"\r",Port2);
    RecPointer=ReadPointer=0;                                //清除接受缓存区
    status=ModemCommand(tempch);   
    if(status!=MODEM_CONNECT)
    {
        //while(1)
        //{
            //UART0_SendString((uint8 *)"执行命令错误\r\n");
            //DelayNS(10);
        //}
        RecPointer=ReadPointer=0;
        return 1;
    }
    RecPointer=ReadPointer=0;
    return 0;
}

uint8 Register_Service(uint8 mode)
{
    uint8 status;
    uint8 count=0;
    char  tempch[20];
    
    sprintf(tempch,"AT#OTCP=%d\r",mode);
OTCP:    
    RecPointer=ReadPointer=0;                                //清除接受缓存区    
    status=ModemWrite(tempch,strlen(tempch));
    if(status!=MODEM_CONNECT)
    {
        //while(1)
        //{
            //UART0_SendString((uint8 *)"执行命令错误\r\n");
            //DelayNS(10);
        //}
        RecPointer=ReadPointer=0;
        return 1;
    }
OTCP_WAIT:    
    DelayNS(10);
    while(ReadPointer<RecPointer)
    {
        if(RecBuff[ReadPointer]!='1')
        {
            ReadPointer++;
            continue;
        }
        
        if(ReadPointer+3>=RecPointer)
        {
            if(count>12)
            {
                RecPointer=ReadPointer=0;
                return 1;
            }
            count++;
            if(count%4!=0)
            {
                goto OTCP_WAIT;
            }
            else
            {
                goto OTCP;
            }
        }
        
        if(RecBuff[ReadPointer+1]!='0'||RecBuff[ReadPointer+2]!='2'||RecBuff[ReadPointer+3]!='8')
        {  
            ReadPointer++;
            continue;
        }
        
        if(ReadPointer+5>=RecPointer)
        {
            if(count>12)
            {
                RecPointer=ReadPointer=0;
                return 1;
            }
            count++;
            if(count%4!=0)
            {
                goto OTCP_WAIT;
            }
            else
            {
                goto OTCP;
            }
        }
        
        if(RecBuff[ReadPointer+4]!=0x0D||RecBuff[ReadPointer+4]!=0x0A)
        {
            ReadPointer++;
            continue;
        }
        RecPointer=ReadPointer=0;
        return 0;   
    }
    
        
    if(RecPointer==0)
    {
        if(count>12)
        {
            RecPointer=ReadPointer=0;
            return 1;
        }
        count++;
        if(count%4!=0)
        {
            goto OTCP_WAIT;
        }
        else
        {
            goto OTCP;
        }
    }
    else
    {
        RecPointer=ReadPointer=0;
        return 0; 
    }
    
    RecPointer=ReadPointer=0;
    return 0;
}

uint8 GPRS_Send(uint8 *buf,uint16 length)
{
    uint8 status;
    
    status=ModemWrite((char*)buf,length);
    if(status!=MODEM_CONNECT)
    {
        //RecPointer=ReadPointer=0;
        return 1;
    }
    
    //RecPointer=ReadPointer=0;
    return 0;
}

uint16 GPRS_Recive(uint8 *buf,uint16 length)
{
    uint8 count=0;
    uint16 templength;
    while(1)
    {
        
        if(RecPointer<length)
        {
            if(count>=3)
            {
                if(RecPointer==0)
                    return 0;
                memcpy(buf,RecBuff,RecPointer);
                templength=RecPointer;
                RecPointer=0;
                return templength;
            }    
            DelayNS(10);
            count++;
        }
        else
        {
            memcpy(buf,RecBuff,RecPointer);
            templength=RecPointer;
            RecPointer=0;
            return templength; 
        }
    }
}

uint8 Hold_Active(void)
{
    uint8 status;
    status=ModemWrite((char*)Hold_String,strlen(Hold_String));
    if(status!=MODEM_CONNECT)
    {
        //RecPointer=ReadPointer=0;
        return 1;
    }
    
    //RecPointer=ReadPointer=0;
    return 0;
}

uint8 AT_Comminute(void)
{
    uint8 status;
    RecPointer=ReadPointer=0;                   //清除接受缓存区
    status=ModemCommand("ATO");  
    if(status!=MODEM_CONNECT)
    {
        //while(1)
        //{
            //UART0_SendString((uint8 *)"执行命令错误\r\n");
            //DelayNS(10);
        //}
        RecPointer=ReadPointer=0;
        return 1;
    }
    
    RecPointer=ReadPointer=0;
    return 0;  
}

uint8 Comminute_AT(void)
{
    uint8 status;
    
    RecPointer=ReadPointer=0;                   //清除接受缓存区
    status=ModemCommand("+++"); 
    if(status!=MODEM_CONNECT)
    {
        //while(1)
        //{
            //UART0_SendString((uint8 *)"执行命令错误\r\n");
            //DelayNS(10);
        //}
        RecPointer=ReadPointer=0;
        return 1;
    }
    
    RecPointer=ReadPointer=0;
    return 0;   
}

int  main(void)
{ 
    int8   status;
    uint8  buf[512];
    uint16 length;
    uint16 r_length;
    
    UART0_Init();
START_GPRS:    
    status=Start_GPRS();
    if(status!=0)
    {
        //while(1)
        //{
            //UART0_SendString((uint8 *)"启动GPRS失败\r\n");
            //DelayNS(10);
        //}
        Reset_GPRS();
        goto START_GPRS; 
    }
    
    status=Check_SIMCard();
    if(status!=0)
    {
        while(1)
        {
            UART0_SendString((uint8 *)"请插入SIM卡\r\n");
            DelayNS(10);
        } 
    }
    
    status=Check_CSQ();
    if(status!=0)
    {
        while(1)
        {
            UART0_SendString((uint8 *)"信号太弱,无法和服务器通讯\r\n");
            DelayNS(10);
        } 
    }
    
    status=Config_GPRS();
    if(status!=0)
    {
        while(1)
        {
            UART0_SendString((uint8 *)"GPRS配置失败\r\n");
            DelayNS(10);
        }
    }
    
    status=Start_TCP();
    if(status!=0)
    {
        while(1)
        {
            UART0_SendString((uint8 *)"TCP配置失败\r\n");
            DelayNS(10);
        }
    }
    
    status=Register_Service(1);
    if(status!=0)
    {
        while(1)
        {
            UART0_SendString((uint8 *)"登录服务器失败\r\n");
            DelayNS(10);
        }
    }
    do{
        status=GPRS_Send(buf,length);
        if(status!=0)
        {
            while(1)
            {
                UART0_SendString((uint8 *)"GPRS发送数据失败\r\n");
                DelayNS(10);
            }     
        }
        
        r_length=GPRS_Recive(buf,length);
        if(r_length!=0)
        {
            //while(1)
            //{
                UART0_SendDataLen(buf,r_length);
                DelayNS(10);
            //}     
        }
    }while(1);
    return(0);
}


uint8 Q2403A(void)
{
    uint8 status;
    
    RecPointer=ReadPointer=0;               //清除接受缓存区
    status=ModemCommand("AT\r");
    if(status!=MODEM_CONNECT)
    {
        while(1)
        {
            UART0_SendString((uint8 *)"执行命令错误\r\n");
            DelayNS(10);
        }
    }
    
    
    RecPointer=ReadPointer=0;               //清除接受缓存区
    status=ModemCommand("AT+CMEE=1\r");     //设置出错后得到错误代码号
    if(status!=MODEM_CONNECT)
    {
        while(1)
        {
            UART0_SendString((uint8 *)"执行命令错误\r\n");
            DelayNS(10);
        }
    }
    
    RecPointer=ReadPointer=0;               //清除接受缓存区
    status=ModemWrite("AT+CCID\r",8);       //检测是否装有SIM 卡
    if(status!=MODEM_CONNECT)
    {
        while(1)
        {
            UART0_SendString((uint8 *)"执行命令错误\r\n");
            DelayNS(10);
        }
    }
    DelayNS(1);
    if(ReadPointer<RecPointer)
    {
        //测试没插入SIM卡的返回值、插入SIM卡返回卡ID号
        if((RecBuff[RecPointer-1]==13)&&(RecBuff[RecPointer-2]=='0'))
        {
            //打印SIM_ID
            UART0_SendDataLen(&RecBuff[8],RecPointer-13);
        }
        else
        {
            while(1)
            {
                UART0_SendString((uint8 *)"执行命令错误\r\n");
                DelayNS(10);
            }
        }    
    }
    else
    {
        while(1)
        {
            UART0_SendString((uint8 *)"GPRS无应答或设备不存在\r\n");
            DelayNS(10);
        }
    }
    RecPointer=ReadPointer=0;                   //清除接受缓存区
    status=ModemCommand("AT+CGCLASS=\"B\"\r");  //设置移动终端的类别为B类,即具有GPRS上网和GSM语音功能,但二者不能同时使用,可自动切换
    if(status!=MODEM_CONNECT)
    {
        while(1)
        {
            UART0_SendString((uint8 *)"执行命令错误\r\n");
            DelayNS(10);
        }
    }
    
    RecPointer=ReadPointer=0;                                //清除接受缓存区
    //超级终端测试、返回值处理
    status=ModemCommand("AT+CGDCONT=1,\"IP\",\"CMNET\"\r");  //设置 1:表示使用第一种配置方案、IP:表示协议、CMNET:APN;GSM7.07标准 
    if(status!=MODEM_CONNECT)
    {
        while(1)
        {
            UART0_SendString((uint8 *)"执行命令错误\r\n");
            DelayNS(10);
        }
    }
 
CSQ:    
    RecPointer=ReadPointer=0;                                //清除接受缓存区    
    status=ModemWrite("AT+CSQ\r",7);
    if(status!=MODEM_CONNECT)
    {
        while(1)
        {
            UART0_SendString((uint8 *)"执行命令错误\r\n");
            DelayNS(10);
        }
    }
    DelayNS(1);
    while(ReadPointer<RecPointer)
    {
        //返回10-31、0继续,如返回99,99;则信号太差、使用“A/”命令不停的搜寻网络
        //返回的第一个表示信号强度:最大应为30,一般为28左右、第二个表示:误码率为0
        //正确返回的长度应该是13,+CSQ:XX,0\r\n0\r
        if(!(RecBuff[RecPointer-1]==13&&RecBuff[RecPointer-2]=='0'))
        {
            
                UART0_SendString((uint8 *)"无信号\r\n");
                //ReadPointer=RecPointer=0;
                //ModemCommand("A\\");
                DelayNS(10);
                //continue;
                goto CSQ;
        }
        
        if(RecBuff[7]==',')
        {
            UART0_SendString((uint8 *)"信号太弱\r\n");
            //ReadPointer=RecPointer=0;
            //ModemCommand("A\\");
            DelayNS(10); 
            //continue;
            goto CSQ;
        }
        else
        {
            if(RecBuff[6]=='9'&&RecBuff[7]=='9')
            {
                UART0_SendString((uint8 *)"无信号\r\n");
                //ReadPointer=RecPointer=0;
                //ModemCommand("A\\");
                DelayNS(10); 
                //continue;
                goto CSQ;
            }
        }
        
        break;
    }
    
    if(RecPointer==0)
    {
        //信号检测失败
        goto CSQ;
    }
    else
    {
        //信号检测成功
        RecPointer=ReadPointer=0; 
    }
    
    RecPointer=ReadPointer=0;                                //清除接受缓存区
    //超级终端测试、返回值处理
    status=ModemCommand("AT+CGACT=1,1\r");                  //激活GPRS功能、如果SIM卡开通GPRS功能则返回OK,否则返回ERROR
    if(status!=MODEM_CONNECT)
    {
        while(1)
        {
            UART0_SendString((uint8 *)"SIM卡尚未开通GPRS功能\r\n");
            DelayNS(100);
        }
    }
    
 REG:   
    RecPointer=ReadPointer=0;                                //清除接受缓存区    
    status=ModemWrite("AT+CGREG?\r",10);                     //检测是否登陆上GPRS 网络   
    if(status!=MODEM_CONNECT)
    {
        while(1)
        {
            UART0_SendString((uint8 *)"执行命令错误\r\n");
            DelayNS(100);
        }
    }
    DelayNS(1);
    while(RecPointer>0)
    {
        //返回+CGREG: 0, 1、5成功登陆、返回+CGREG: 0, 0 登陆失败,则不停的发送“A/”命令重新登入
        if(!(RecBuff[RecPointer-1]==13&&RecBuff[RecPointer-2]=='0'))
        {
            UART0_SendString((uint8 *)"登陆失败\r\n");
            //ReadPointer=RecPointer=0;
            //ModemCommand("A\\");
            DelayNS(10);
            //continue;
            goto REG;
        }
        
        if((RecBuff[9]!=',')||(RecBuff[8]!=0x30)||(RecBuff[10]!=0x31&&RecBuff[10]!=0x35))
        {
            UART0_SendString((uint8 *)"登陆失败\r\n");
            //ReadPointer=RecPointer=0;
            //ModemCommand("A\\"); 
            DelayNS(10);
            //continue;
            goto REG;
        }
        
        break;
    }
    
    if(RecPointer==0)
    {
        //注册失败
        goto REG;
    }
    else
    {
        //注册成功
        RecPointer=ReadPointer=0; 
    }
    
    //拨号、使用PPP协议
    status=ModemWrite("ATD*99***1#\r",12);
    if(status!=MODEM_CONNECT)
    {
        while(1)
        {
            UART0_SendString((uint8 *)"拨号失败\r\n");
            DelayNS(100);
        }
    }
    //PPP协议约定
    status=PPP_Process();
    
    return 0;
}

uint8 PPP_Process(void)
{
    
    
    return 0;   
}

⌨️ 快捷键说明

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