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

📄 main.c

📁 一个完整的MODEM例程
💻 C
📖 第 1 页 / 共 2 页
字号:
#include "config.h"
#include "stdio.h"
#define MAX_RS232_BUF       512     //串口接收缓存区
#define UART_BPS            9600

const char Hold_String[]={"Intek"};

extern void  DelayNS(uint32  dly);
extern void  UART1_Exception(void); 
extern uint8  ModemCommand(char *Command);  
extern uint8 RecBuff[1024];
extern volatile uint16 RecPointer;
extern volatile uint16 ReadPointer;
volatile uint8 WareRevPointer;

const uint8 ServerIP1[]={218,56,226,241};
const uint8 ServerIP2[]={218,56,226,241};
const uint16  Port1=1010;
const uint16  Port2=0x1010; 
uint8  WareRevbuf[MAX_RS232_BUF];
uint8  PPP_Process(void);
void   __irq IRQ_UART0(void)
{   
	uint8 temp;
	
	temp=U0IIR;
    if( 0x04==(temp&0x0F) )  
	{	
	    WareRevbuf[WareRevPointer]=U0RBR;
	    WareRevPointer++;
	    if(WareRevPointer>=MAX_RS232_BUF)
	        WareRevPointer=0;
	}
    
    VICVectAddr = 0x00;              		// 中断处理结束
}	

void UART0_SendString(uint8 *str)
{
    while(*str)
    {
        U0THR=*str;
        while( (U0LSR&0x40)==0 );		
        str++;
    }
}

void UART0_SendDataLen(uint8 *buf,uint8 length)
{
    uint8 i;
    
    i=0;
    while(i<length)
    {
        U0THR=buf[i];
        while( (U0LSR&0x40)==0 );		
        i++;
    } 
}

void  UART0_Init(void)
{
    uint16 Fdiv;
	
	PINSEL0 = (PINSEL0&0xFFFFFFF0)|0x05;		    // 设置I/O连接到UART0
	IO1DIR = (IO1DIR&0xFCFFFFFF)|0x03000000;
	
	U0LCR = 0x83;		                            // DLAB = 1,可设置波特率
	Fdiv = (Fpclk / 16) / UART_BPS;                 // 设置波特率
	U0DLM = Fdiv / 256;							
	U0DLL = Fdiv % 256;						
	U0LCR = 0x03;
	U0IER = 0x03;
	VICVectCntl3 = 0x26;        			        // UART0中断通道分配到IRQ slot 0,即优先级最高
	VICVectAddr3 = (int)IRQ_UART0;       	        // 设置UART0向量地址
	VICIntEnable |= 0x00000040;           	        // 使能UART0中断
}

uint8 Check_SIMCard(void)
{
    uint8 status;
    
    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);
            RecPointer=ReadPointer=0;
            return 0;
        }
        else
        {
            //while(1)
            //{
                //UART0_SendString((uint8 *)"执行命令错误\r\n");
                //DelayNS(10);
            //}
            RecPointer=ReadPointer=0;
            return 1;
        }    
    }
    else
    {
        //while(1)
        //{
            //UART0_SendString((uint8 *)"GPRS无应答或设备不存在\r\n");
            //DelayNS(10);
        //}
        RecPointer=ReadPointer=0;
        return 1;
    }
}


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

uint8 Check_CSQ(void)
{
    uint8 status;
    uint8 count=0;
  CSQ:    
    RecPointer=ReadPointer=0;                                //清除接受缓存区    
    status=ModemWrite("AT+CSQ\r",7);
    if(status!=MODEM_CONNECT)
    {
        //while(1)
        //{
            //UART0_SendString((uint8 *)"执行命令错误\r\n");
            //DelayNS(10);
       //}
       RecPointer=ReadPointer=0;
       return 1;
    }
    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");
                if(count>10)
                {
                    RecPointer=ReadPointer=0;
                    return 1;
                }
                count++;
                DelayNS(10);
                goto CSQ;
        }
        
        if(RecBuff[7]==',')
        {
            //UART0_SendString((uint8 *)"信号太弱\r\n");
            if(count>10)
            {
               RecPointer=ReadPointer=0; 
               return 1;
            }
            count++;
            DelayNS(10); 
            goto CSQ;
        }
        else
        {
            if(RecBuff[6]=='9'&&RecBuff[7]=='9')
            {
                //UART0_SendString((uint8 *)"无信号\r\n");
                if(count>10)
                {
                    RecPointer=ReadPointer=0;
                    return 1;
                }
                count++;
                DelayNS(10); 
                goto CSQ;
            }
        }
        
        break;
    }
    
    if(RecPointer==0)
    {
        //信号检测失败
        if(count>10)
        {
            RecPointer=ReadPointer=0;
            return 1;
        }
        count++;
        goto CSQ;
    }
    else
    {
        //信号检测成功
        RecPointer=ReadPointer=0;
        return 0; 
    }
    
    RecPointer=ReadPointer=0;
    return 0;
}

uint8 Reset_GPRS(void)
{
    uint8 status;
    
    RecPointer=ReadPointer=0;                   //清除接受缓存区
    status=ModemWrite("AT+CFUN=0\r",10);  //设置移动终端的类别为B类,即具有GPRS上网和GSM语音功能,但二者不能同时使用,可自动切换
    do{
        DelayNS(10);
    }while(RecPointer>0);
    
    RecPointer=ReadPointer=0;                   //清除接受缓存区
    status=ModemWrite("AT+CFUN=1\r",10);  //设置移动终端的类别为B类,即具有GPRS上网和GSM语音功能,但二者不能同时使用,可自动切换
    //do{
        //DelayNS(10);
    //}while(RecPointer>0);
    DelayNS(100);
    return 0;
}

uint8 Config_GPRS(void)
{
    uint8 status;
    
    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;
        return 1;
    }
    
    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);
        //}
        RecPointer=ReadPointer=0;
        return 1;
    }
CGATT_AGAIN:    
    RecPointer=ReadPointer=0;                                //清除接受缓存区
    status=ModemWrite("AT+CGATT=1\r",11);
    if(status!=MODEM_CONNECT)
    {
        //while(1)
        //{
            //UART0_SendString((uint8 *)"执行命令错误\r\n");
            //DelayNS(10);
       //}
       RecPointer=ReadPointer=0;
       return 1;
    }
CGATT_WAIT:    
    DelayNS(20);
    while(ReadPointer<RecPointer)
    {
        if(RecPointer==2)
        {
            if(RecBuff[0]!='0'||RecBuff[1]!=0x0D)
            {
                goto CGATT_AGAIN;
            }
            else
            {
                break;
            }
        }
    }
    
    if(RecPointer==0)
    {
        goto CGATT_WAIT;
    }
    //status=ModemCommand("AT+CGATT=1\r");   
    //if(status!=MODEM_CONNECT)
    //{
        //while(1)
        //{
            //UART0_SendString((uint8 *)"执行命令错误\r\n");
            //DelayNS(10);
        //}
        //RecPointer=ReadPointer=0;
        //return 1;
    //}
    
    RecPointer=ReadPointer=0;                                //清除接受缓存区    
    status=ModemWrite("AT+CGATT?\r",10);
    if(status!=MODEM_CONNECT)
    {
        //while(1)
        //{
            //UART0_SendString((uint8 *)"执行命令错误\r\n");
            //DelayNS(10);
        //}
        RecPointer=ReadPointer=0;
        return 1;
    }
    
    DelayNS(5);
    while(ReadPointer<RecPointer)
    {
        if(RecBuff[ReadPointer]=='+')
        {
            status=memcmp(&RecBuff[ReadPointer],"+CGATT: 1\r\n",11);
            if(status!=0)
            {
                goto CGATT_AGAIN;
            }
            else
            {
                RecPointer=ReadPointer=0;
                return 0;
            }
        }
        
        ReadPointer++;
    }
    
    if(RecPointer==0)
        goto CGATT_AGAIN;
    else if(ReadPointer==RecPointer)    
        goto CGATT_AGAIN;
        
    RecPointer=ReadPointer=0;
    return 0;
}

uint8 Stop_TCP(void)
{
    uint8 status;
    
    RecPointer=ReadPointer=0;               //清除接受缓存区
    status=ModemWrite("AT#CONNECTIONSTOP\r",18);
    if(status!=MODEM_CONNECT)
    {
        //while(1)
        //{
            //UART0_SendString((uint8 *)"执行命令错误\r\n");
            //DelayNS(10);
        //}
        RecPointer=ReadPointer=0;
        return 1;
    }
    
    status=0;
CONNECTIONSTOP_WAIT:    
    do{
        if(status>4)
            break;
        if(status>20)
            return 1;    
        status++;
        DelayNS(10);
    }while(RecPointer==0);
    
    if(RecPointer==2)
    {
        if(RecBuff[0]=='0'&&RecBuff[1]==0x0D)
        {
            return 0;
        }
        else
            goto CONNECTIONSTOP_WAIT;
    }
    
    return 0;

}

uint8 Start_TCP(void)
{
    uint8 status;
    uint8 demc=0;
    uint8 count=0;
    
    char tempch[30];
    
CONNECTIONSTART:    
    RecPointer=ReadPointer=0;                                //清除接受缓存区    
    status=ModemWrite("AT#CONNECTIONSTART\r",19);
    if(status!=MODEM_CONNECT)
    {
        //while(1)
        //{
            //UART0_SendString((uint8 *)"执行命令错误\r\n");
            //DelayNS(10);
        //}
        RecPointer=ReadPointer=0;
        return 1;
    }
WAIT:    
    status=0;
    do{
        if(status>4)
            break;
        status++;
        DelayNS(10);
    }while(RecPointer<0x12);
    
    while(ReadPointer<RecPointer)
    {
        if(RecBuff[ReadPointer]=='.')
        {
            demc++;
        }
        
        ReadPointer++;
    }
    
    if(demc==3)
    {
        if(RecBuff[RecPointer-3]!='6'||RecBuff[RecPointer-4]!='8'||RecBuff[RecPointer-5]!='0'||RecBuff[RecPointer-6]!='3')  //3086
        {
            
            if(count>12)
            {
                RecPointer=ReadPointer=0;
                return 1;
            }
            count++;
            if(count%4==0)
                goto CONNECTIONSTART;
            else
                goto WAIT;        
        }
        
        /*if(RecBuff[RecPointer-2]!=0x0D||RecBuff[RecPointer-1]!=0x0A)
        {
            if(count>12)
            {
                RecPointer=ReadPointer=0;
                return 1;
            }
            count++;
            if(count%4==0)
                goto CONNECTIONSTART;
            else
                goto WAIT; 
        }*/
        
        /*if(RecBuff[RecPointer-7]!=0x0A||RecBuff[RecPointer-8]!=0x0D)
        {
            if(count>12)
            {
                RecPointer=ReadPointer=0;
                return 1;
            }
            count++;
            if(count%4==0)
                goto CONNECTIONSTART;
            else
                goto WAIT; 
        }*/
        
        //获取移动分配的IP 
        
    }
    else
    {
        if(demc==0)
        {
            status=memcmp(RecBuff,"#CME ERROR: 35840\r\n",0x13);
            if(status==0)
            {
                Stop_TCP();
                goto CONNECTIONSTART;
            }
        }
       
        if(count>12)
        {
            RecPointer=ReadPointer=0;
            return 1;
        }
        count++;
        if(count%4==0)
            goto CONNECTIONSTART;
        else
            goto WAIT; 
    }
    
    if(RecPointer==0)
    {
        if(count>12)
        {
           RecPointer=ReadPointer=0; 
           return 1;
        }
        count++;
        if(count%4==0)
            goto CONNECTIONSTART;
        else
            goto WAIT; 
        //goto WAIT; 
    }
    else
    {
        //检测成功
        RecPointer=ReadPointer=0;
       
    }
    
    sprintf(tempch,"AT#TCPSERV=1,\"%d.%d.%d.%d\"\r",ServerIP1[0],ServerIP1[1],ServerIP1[2],ServerIP1[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=1,\"%d\"\r",Port1);
    RecPointer=ReadPointer=0;                                //清除接受缓存区
    status=ModemCommand(tempch);   
    if(status!=MODEM_CONNECT)

⌨️ 快捷键说明

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