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传感器的数据采集