GPRS/3G

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了GPRS/3G相关的知识,希望对你有一定的参考价值。

像GPRS/3G模块之类的应用,需要连接,登陆,初始化等步骤完成后才能传输数据,而这些步骤又比较耗时。

所以用 状态机 + 超时 的机制来实现比较合理。

我有systick依赖症,所以用systick来做超时检测(其他定时器也都一样)。

因为这种AT指令来操作的模块一般是基于串口的,所以透传模式就类似于串口传输了。

void SysTick_Handler(void)
 {
   msTicks++;          
}


void gprs_init(void)
 
{    
    if((strstr(aUart5RxBuffer, "command ready") == NULL)
 
        /*||(strstr(aUart5RxBuffer, "+SIM READY") == NULL)*/) 
    {
 
         gprs_init_ok = 0;                        
 
    }
 
    else
 
    {
 
         gprs_init_ok = 1;   
 
    }  
 
}
 


void ppp_config(void)
 
{         
 
    switch (ppp_config_step)
 
    {
 
        case 0:
 
            free_rom_buf(aUart5RxBuffer,sizeof(aUart5RxBuffer));
 
            gprs_puts("AT+GTSET=\"LPMMODE\",0\r\n");
 
            gprs_tick = msTicks;            
 
            ppp_config_step = 1; 
            break;
 
        case 1:
 
            if((msTicks - gprs_tick) > 500)
 
            {        
 
                if(strstr(aUart5RxBuffer, "OK") == NULL)                   
                {
 
                    ppp_config_step = 0;                    
 
                }
 
                else
 
                {
 
                    ppp_config_step = 2;                                   
 
                } 
                free_rom_buf(aUart5RxBuffer,sizeof(aUart5RxBuffer));                         
            }                
            break;
 
                
//===================================================            
 
        case 2:
 
            gprs_puts("AT+CPIN?\r\n");
 
            ppp_config_step = 3;
 
            gprs_tick = msTicks;
 
            break;        
 
        case 3:
 
            if((msTicks - gprs_tick) > 500)
 
            {
 
                if((strstr(aUart5RxBuffer, "OK") == NULL) || (strstr(aUart5RxBuffer, "+CPIN: READY") == NULL))
 
                {
 
                     ppp_config_step = 2;
 
                }
 
                else
 
               {
 
                    ppp_config_step = 4;                                                                     
 
               }
 
               free_rom_buf(aUart5RxBuffer,strlen(aUart5RxBuffer));
 
            }            
 
            break;          
//======================================================           
 
        case 4:
 
            gprs_puts("AT+CSQ\r\n");
 
            ppp_config_step = 5;
 
            gprs_tick = msTicks;
 
            break;
 
        case 5:
 
            if((msTicks - gprs_tick) > 500)
 
            {
 
                if(strstr(aUart5RxBuffer, "OK") == NULL)
 
                {
 
                    ppp_config_step = 4;
 
                }
 
                else
 
                {
 
                    ppp_config_step = 6;                            
                }
 
                free_rom_buf(aUart5RxBuffer,strlen(aUart5RxBuffer));
 
            }            
 
            break;
 
             
//=====================================================            
 
        case 6:
 
            gprs_puts("AT+CREG?\r\n");
 
            ppp_config_step = 7;
 
            gprs_tick = msTicks;
 
            break;
 
        case 7:
 
            if((msTicks - gprs_tick) > 500)
 
            {
 
                if(strstr(aUart5RxBuffer, "+CREG: 0,0") == NULL)
 
                {
 
                    ppp_config_step = 8;
 
                }
 
                else
 
                {
 
                    ppp_config_step = 6;                   
                }
 
                free_rom_buf(aUart5RxBuffer,strlen(aUart5RxBuffer));
 
            }            
 
            break;
 
            
 
//=========================================================
 
        case 8:
 
            //gprs_puts("AT+MIPCALL=1,\"3GNET\"\r\n");
 
            gprs_puts("AT+MIPCALL=1,\"xagfzqx.ydoa.snapn\"\r\n");
 
            ppp_config_step = 9;
 
            gprs_tick = msTicks;
 
            break;
 
        case 9:
 
            if((msTicks - gprs_tick) > 3000)
 
            {
 
                if(strstr(aUart5RxBuffer, "+MIPCALL: 0") == NULL)
 
                {
 
                        ppp_config_step = 0;
 
                        ppp_config_ok = 1;                    
 
                }
 
                else
 
                {
 
                      ppp_config_step = 8;                                     
                }
 
                free_rom_buf(aUart5RxBuffer,strlen(aUart5RxBuffer));
 
            }            
 
            break;             
                   
        default:
 
            break;
 
    }    
       
}
 

void gprs_monit_routine(void)
 
{    
   if(!gprs_init_ok)                                          { gprs_init();      }
 
   
 
   if((gprs_init_ok)&&(!ppp_config_ok))                       { ppp_config();     } 
     
 
   if((ppp_config_ok)&&(data_is_ok)&&(!http_send_cmplt))      { http_send_test(); }         
 
}  
 


初始化成功了就可以传输数据了,数据发送和接收都跟串口一样。主要工作都在初始化 ,和异常修复机制的实现。因为网络传输每一步都可能会失败,而且外部因素太多,所以异常修复机制尤其重要。

代码实例完全都是按规格书流程来操作的,规格书链接:http://pan.baidu.com/s/1sjSMu6p 密码:cam1

 

以上是关于GPRS/3G的主要内容,如果未能解决你的问题,请参考以下文章

GPRS/3G/4G无线数传DTU鱼塘养殖MQTT协议 ip modem

GPRS/3G/4G无线数传DTU充电桩开关量模拟量IP MODEM远程测控

ip modem温室大棚GPRS/3G/4G无线数传DTU传感器的数据采集

ip modem温室大棚GPRS/3G/4G无线数传DTU传感器的数据采集

通过 ActiveSync 调试网络的问题

斜杠(右斜杠)/ 与 反斜杠(右斜杠)