标签:
像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
标签:
原文地址:http://www.cnblogs.com/dong1/p/5224338.html