搜索
bottom↓
回复: 40

求助AT指令GPRS拨号框架相关问题

[复制链接]

出0入0汤圆

发表于 2017-11-25 10:09:38 | 显示全部楼层 |阅读模式
        如题,最近一直玩GPRS的TCP/UDP通信,以前GPRS模块的驱动用状态机写的,能凑活着用。但是随着里面的逻辑增多用状态机的方式感觉程序越来越繁琐,越来越没有可读性。想换成RTOS的方式。其中有些框架以及算法不确定怎么设计效率更高,一下是我的基本想法,请各位坛友指点一下。
        基本要求如下:
        1.MCU平台RAM最大32K
        2.RTOS选择uCOS或者FreeRTOS
        3.GPRS拨号命令最好是做成可配置的,一便支持不同厂家的模块
        3.支持多路链接,断线自动重连
        基本思路如下:
        1.线程1,负责模块开关机、设置APN等到connect前的所有步骤(串口缓存数据采用全局变量方式)
        2.线程1结束后删除自己,创建connect线程,用户connect不同通道以及检测链接状态,创建发送线程,用户发送数据
        3.串口中断处理中解析出收到的数据包通过队列同步到其他任务
        由于RAM资源有限我不可能去创建很多的线程。以上是我的基本想法,不知道各位大佬们有没有更加精炼的算法或者其他方面又更好的建议,请指点迷津!

出0入0汤圆

发表于 2017-11-25 10:11:23 | 显示全部楼层
状态机加回调不行么   

出0入0汤圆

 楼主| 发表于 2017-11-25 10:29:06 | 显示全部楼层
浮华一生 发表于 2017-11-25 10:11
状态机加回调不行么

不想用状态机了太费劲了

出100入113汤圆

发表于 2017-11-25 10:35:53 | 显示全部楼层
这个驱动,一系列的动作本来就是串行的,没必要多任务吧?状态机挺好的啊,把状态图规划清楚,不乱吧?

出0入0汤圆

 楼主| 发表于 2017-11-25 11:00:15 | 显示全部楼层
saccapanna 发表于 2017-11-25 10:35
这个驱动,一系列的动作本来就是串行的,没必要多任务吧?状态机挺好的啊,把状态图规划清楚,不乱吧? ...

关键问题是应用上面的逻辑乱

出100入113汤圆

发表于 2017-11-25 11:04:10 | 显示全部楼层
1328616904 发表于 2017-11-25 11:00
关键问题是应用上面的逻辑乱

你是要做多路TCP连接吗?那把驱动层和应用层分开就好了。我做单TCP连接的,使用状态机,感觉还好,状态考虑全面点,各种异常都有相应的处理回归正常状态。

出0入0汤圆

 楼主| 发表于 2017-11-25 11:16:36 | 显示全部楼层
saccapanna 发表于 2017-11-25 11:04
你是要做多路TCP连接吗?那把驱动层和应用层分开就好了。我做单TCP连接的,使用状态机,感觉还好,状态考 ...

大佬可否给个算法或者代码拜读一下,我看了很多感觉写的都不好

出0入0汤圆

发表于 2017-11-25 12:57:40 | 显示全部楼层
如果这样的话,那么最好移植个PPP程序,直接用外部ppp协议栈,就可以兼容所有模块了

出0入0汤圆

发表于 2017-11-25 14:52:06 | 显示全部楼层
手机里面的ril机制很好,就是有点复杂,看了好久没弄清逻辑
可以关注下开源的luat,里面也有ril机制,逻辑很简单清晰的,可惜不会lua,想翻译成c那叫一个痛苦

出0入0汤圆

发表于 2017-11-25 19:09:47 | 显示全部楼层
alios开源里面有个at框架 可以参考
现在的开源可选很多

出0入8汤圆

发表于 2017-11-25 19:27:56 来自手机 | 显示全部楼层
有没有demo   大家是根据什么判断网络断掉的

出0入36汤圆

发表于 2017-11-25 20:12:50 来自手机 | 显示全部楼层
我用ucos,专门在一个任务里面,用消息队列实现状态机,实现开机连接服务器、维持心跳包、断线重连、发送数据的服务,我准备换成裸奔实现了,RTOS比较费资源。

出0入0汤圆

 楼主| 发表于 2017-11-25 21:24:28 来自手机 | 显示全部楼层
dadongleilei 发表于 2017-11-25 12:57
如果这样的话,那么最好移植个PPP程序,直接用外部ppp协议栈,就可以兼容所有模块了 ...

大佬有demo么

出0入0汤圆

 楼主| 发表于 2017-11-25 21:24:59 来自手机 | 显示全部楼层
lyzhangxiang 发表于 2017-11-25 19:09
alios开源里面有个at框架 可以参考
现在的开源可选很多

谢谢我看下

出0入0汤圆

 楼主| 发表于 2017-11-25 21:25:37 来自手机 | 显示全部楼层
justdomyself 发表于 2017-11-25 19:27
有没有demo   大家是根据什么判断网络断掉的

我一般是底层查询模块的链接状态,应用层用心跳包

出0入0汤圆

 楼主| 发表于 2017-11-25 21:26:23 来自手机 | 显示全部楼层
redworlf007 发表于 2017-11-25 20:12
我用ucos,专门在一个任务里面,用消息队列实现状态机,实现开机连接服务器、维持心跳包、断线重连、发送数 ...

可否拜读一下代码,我想写一个开源的

出0入8汤圆

发表于 2017-11-25 22:21:53 | 显示全部楼层
1328616904 发表于 2017-11-25 21:25
我一般是底层查询模块的链接状态,应用层用心跳包

底层的不可靠   我是通过几个心跳不回来判断掉线

出0入0汤圆

 楼主| 发表于 2017-11-25 23:43:00 来自手机 | 显示全部楼层
justdomyself 发表于 2017-11-25 22:21
底层的不可靠   我是通过几个心跳不回来判断掉线

可靠的,去用sim800系列不可靠还的需要设置东西才行

出0入8汤圆

发表于 2017-11-25 23:48:58 | 显示全部楼层
1328616904 发表于 2017-11-25 23:43
可靠的,去用sim800系列不可靠还的需要设置东西才行

那你这样说  我们用的4g 模块简直是垃圾中的战斗机了。拔天线都没反应,明明断网,狗屁提示没有

出0入0汤圆

 楼主| 发表于 2017-11-26 09:04:39 来自手机 | 显示全部楼层
justdomyself 发表于 2017-11-25 23:48
那你这样说  我们用的4g 模块简直是垃圾中的战斗机了。拔天线都没反应,明明断网,狗屁提示没有 ...

正常工作时我同时会查信号,信号低于莫个值回重启网卡,不允许拨号

出0入0汤圆

 楼主| 发表于 2017-11-26 11:04:01 | 显示全部楼层
justdomyself 发表于 2017-11-25 23:48
那你这样说  我们用的4g 模块简直是垃圾中的战斗机了。拔天线都没反应,明明断网,狗屁提示没有 ...

另外,拆下天线未必是没信号啊,只是信号差一点,信号差也能上网啊

出0入8汤圆

发表于 2017-11-26 11:31:59 来自手机 | 显示全部楼层
1328616904 发表于 2017-11-26 11:04
另外,拆下天线未必是没信号啊,只是信号差一点,信号差也能上网啊

这种情况存在    我是确认断线的  

出0入8汤圆

发表于 2017-11-26 11:33:24 来自手机 | 显示全部楼层
1328616904 发表于 2017-11-26 09:04
正常工作时我同时会查信号,信号低于莫个值回重启网卡,不允许拨号

你走的不是透传么?还是AT模式发数据  

出0入8汤圆

发表于 2017-11-26 11:36:02 | 显示全部楼层
读状态就可以知道是否联网吧

出0入0汤圆

发表于 2017-11-26 15:36:26 | 显示全部楼层
去读下android的ril层代码,那个RIL的代码很有借鉴价值。基本使用命令回调来处理,同时监听主动上报的内容,或者借鉴一些modem的open sdk,里面也是将AT命令封装,主要是状态机

出0入0汤圆

 楼主| 发表于 2017-11-26 18:31:45 | 显示全部楼层
fengyuganyu 发表于 2017-11-26 15:36
去读下android的ril层代码,那个RIL的代码很有借鉴价值。基本使用命令回调来处理,同时监听主动上报的内容 ...

可以PM一下Modem的资料么

出0入0汤圆

发表于 2017-11-26 22:07:24 | 显示全部楼层
关注一下,一直都是用着自己几年前写的状态机的.也想着升级一下,可以兼容更多模块.

出0入0汤圆

发表于 2017-11-26 22:31:24 | 显示全部楼层
关注,我也搞GPRS模块,不过我这边都用国网那标准指令模块

出0入0汤圆

 楼主| 发表于 2017-11-27 07:58:45 | 显示全部楼层
mypear 发表于 2017-11-26 22:31
关注,我也搞GPRS模块,不过我这边都用国网那标准指令模块

再标准也得AT操作吧

出0入0汤圆

发表于 2017-11-27 08:38:55 | 显示全部楼层
请问,alios在哪里下载啊?

出0入36汤圆

发表于 2017-11-27 11:21:52 | 显示全部楼层
1328616904 发表于 2017-11-25 21:26
可否拜读一下代码,我想写一个开源的

我写的那个也有问题,我还在重写。。。

出0入0汤圆

 楼主| 发表于 2017-11-27 12:38:56 | 显示全部楼层
efree 发表于 2017-11-27 08:38
请问,alios在哪里下载啊?

去git找,现在支持的BSP还比较少

出0入8汤圆

发表于 2017-11-27 13:24:32 | 显示全部楼层
AT指令有发有回,加个TIMEOUT,很好用,有什么反的?

出0入8汤圆

发表于 2017-11-27 13:27:27 | 显示全部楼层
透传过一手了,到你二手了,成本上去了

出0入0汤圆

发表于 2017-11-27 15:26:37 | 显示全部楼层
我也觉得AT指令很恶心

出0入0汤圆

发表于 2017-11-28 22:49:10 | 显示全部楼层
这个还是很考验功力的。

出0入0汤圆

发表于 2018-1-12 22:48:26 | 显示全部楼层
贴一个曾经想写的可配置程序,没有完成,要处理的状态太不好梳理
实际用过还是能转起来的

  1. const AT_STRUCT AT_Set[]=
  2. {//TimeOut,IsSub,AT_CMD_Err,AT_CMD,AT_CMD_Next,TX,RX,RXE,AT_CMD_Back,Subs
  3.   { 30,   0,10,AT,ATE0            ,"AT\r\n","OK","ERROR",&AT_CMD},
  4.   { 300,  0,10,AT,AT_EXUNSOL      ,"ATE0\r\n","OK","ERROR",&AT_CMD},
  5.   { 30,   0,10,AT,AT_CGREG_SET    ,"AT+IFC=0,0\r\n","OK","ERROR",&AT_CMD},
  6.   { 30,   0,10,AT,AT_CGREG_SET    ,"AT+EXUNSOL="SQ","1"\r\n","OK","ERROR",&AT_CMD},
  7.   { 30,   0,10,AT,AT_CENG        ,"AT+CGREG=2\r\n","OK","ERROR",&AT_CMD},
  8.   { 30,   0,10,AT,AT_CGREG        ,"AT+CENG=1,1\r\n","OK","ERROR",&AT_CMD},//AT+CENG=1,1
  9.   { 30,   1,10,AT,AT_CIPSHUT      ,"AT+CGREG?\r\n","OK","ERROR",&AT_CMD},
  10.   { 300,  0,10,AT,AT_CIPMUX       ,"AT+CIPSHUT\r\n","SHUT OK","ERROR",&AT_CMD},
  11.   { 30,   0,10,AT,AT_CIPHEAD      ,"AT+CIPMUX=1\r\n","OK","ERROR",&AT_CMD},
  12.   { 30,   0,10,AT,AT_CIPSRIP      ,"AT+CIPHEAD=1\r\n","OK","ERROR",&AT_CMD},
  13.   { 30,   0,10,AT,AT_CIPSPRT      ,"AT+CIPSRIP=1\r\n","OK","ERROR",&AT_CMD},
  14.   { 30,   0,10,AT,AT_CSTT         ,"AT+CIPSPRT=0\r\n","OK","ERROR",&AT_CMD},
  15.   { 30,   0,10,AT,AT_CSTT         ,"AT+CIPQSEND=1\r\n","OK","ERROR",&AT_CMD},
  16.   { 30,   0,10,AT,AT_CIICR        ,"AT+CSTT\r\n","OK","ERROR",&AT_CMD},
  17.   { 8500,0,10,AT,AT_CIFSR        ,"AT+CIICR\r\n","OK","ERROR",&AT_CMD},
  18.   { 30,   1,10,AT,AT_CIPSTART0    ,"AT+CIFSR\r\n","10.","ERROR",&AT_CMD},
  19.   { 3000,   0,10,AT,AT_CDNSGIP1    ,"AT+CDNSGIP="111.com"\r\n","+CDNSGIP: 1","ERROR",&AT_CMD},
  20.   { 3000,   0,10,AT,AT_CIPSTART0    ,"AT+CDNSGIP="111.com"\r\n","+CDNSGIP: 1","ERROR",&AT_CMD},
  21.   { 30,   0,10,AT,ATE0            ,"AT+CDNSGIP="alinweb.cn"\r\n","+CDNSGIP: 1","ERROR",&AT_CMD},
  22.   { 3000,   0,10,AT,AT_CIPSTART1    ,"AT+CIPSTART=0,"UDP","111.com","778"\r\n","0, CONNECT OK","0, CONNECT FAIL",&AT_CMD},//
  23.   { 3000,   1,10,AT,AT              ,"AT+CIPSTART=1,"UDP","111.com","7778"\r\n","1, CONNECT OK","1, CONNECT FAIL",&AT_CMD},
  24.   { 30,   0,10,AT,AT              ,"AT+CIPSTART=2,"UDP","0.0.0.0","778"\r\n","2, CONNECT OK","ERROR",&AT_CMD},
  25.   { 30,   0,10,AT,AT_END          ,"AT+CGREG?\r\n","OK","ERROR",&AT_CMD},
  26. };
  27. void GSM_Call(u8 AT_Fun,u8 AT_Len,u8 *AT_Buf)
  28. {
  29.   u8 TX_Buf[1024];
  30.   u16 TX_Len=0;
  31.   
  32.   switch(AT_Fun)
  33.   {
  34.   case 0:
  35.     delay_ms(500);
  36.     TX_Len += sprintf( (char *)TX_Buf + TX_Len,"AT+CTTS=2,"请输入密码,按#号键确认。"\r\n");//ok
  37.     break;
  38.   case 1:
  39.     if((AT_Buf[7]==0x23)&&(GPRS.Password_OK==0)){
  40.       if(GPRS.DTMF_Password==0x1234){
  41.         GPRS.Password_OK=1;
  42.         TX_Len += sprintf( (char *)TX_Buf + TX_Len,"AT+CTTS=2,"密码正确,按1号键开始话音转播。"\r\n");//ok
  43.       }else{
  44.         TX_Len += sprintf( (char *)TX_Buf + TX_Len,"AT+CTTS=2,"错误,请重新确认。"\r\n");//ok
  45.       }
  46.     }else if((AT_Buf[7]==0x31)&&(GPRS.Password_OK==1)){
  47.       TX_Len += sprintf( (char *)TX_Buf + TX_Len,"AT+CTTS=2,"转播开始。"\r\n");//ok
  48.     }else{
  49.       GPRS.DTMF_Password=GPRS.DTMF_Password<<4;
  50.       GPRS.DTMF_Password|=(AT_Buf[7]&0x0F);
  51.     }
  52.     break;
  53.   }
  54.   USART_DMA_TX(GPRS_USART,TX_Len,TX_Buf);
  55.   USART_DMA_TX(6,TX_Len,TX_Buf);
  56. }
  57. void GPRS_IRQ(u8 USART_REG)//串口中断
  58. {

  59. //AT命令接收
  60.   u8 i=0;
  61.   if(GPRS.CMD_Status==2){
  62.     GPRS.CMD_BUFLen=0;
  63.     GPRS.CMD_Status=0;
  64.   }
  65.   if(GPRS.CMD_Status==1){
  66.     if(GPRS.CMD_Len<5)GPRS.CMD_Len++;//
  67.     if((USART_REG==0x0A)&&(GPRS.CMD_Len==1)){
  68.     //if((USART_REG==0x0A)){
  69.       GPRS.CMD_Status=2;
  70.     }else{
  71.       GPRS.CMD_Status=0;
  72.     }
  73.   }
  74.   if(USART_REG==0x0D){
  75.     GPRS.CMD_Status=1;
  76.     GPRS.CMD_Len=0;
  77.   }
  78.   GPRS.CMD_BUF[GPRS.CMD_BUFLen++]=USART_REG;
  79.   if(GPRS.CMD_BUFLen>126)GPRS.CMD_BUFLen=126;
  80. //------------------------------------------------------------------------------

  81.   if(GPRS.Init_CMDTP==0){
  82.     //return;
  83.   }
  84.   
  85.   if(GPRS.CMD_Status==2)//有效命令
  86.   {
  87.     if(Debug.GSM_R==1)USART_DMA_TX(Debug.Usart,GPRS.CMD_BUFLen,GPRS.CMD_BUF);//
  88. //--被动信息--------------------------------------------------------------------
  89.     if(OKTP("+CSQN:")){//信号//2B 43 53 51 4E 3A 20 32 32 2C 30 0D 0A
  90.       if((GPRS.CMD_BUF[0]==0x2B)&&(GPRS.CMD_BUF[6]==0x20)&&(GPRS.CMD_BUF[8]==0x2C)){
  91.         GPRS.CSQ=(GPRS.CMD_BUF[7]&0x0f);
  92.       }else if((GPRS.CMD_BUF[0]==0x2B)&&(GPRS.CMD_BUF[6]==0x20)&&(GPRS.CMD_BUF[9]==0x2C)){
  93.         GPRS.CSQ=((GPRS.CMD_BUF[7]&0x0f)<<4)|(GPRS.CMD_BUF[8]&0x0f);
  94.       }
  95.       GPRS.CSQ=BCD2BIN(GPRS.CSQ);
  96.     }else if(OKTP("+CGREG: 2")){//2B 43 47 52 45 47 3A 20 32 2C 31 2C 22  31 31 41 42 22 2C 22 45 36 39 38 22 0D 0A
  97.         //+CGREG: 2,1,"11AB","E68E"
  98.         //+CGREG: 1,"11AB","E698"
  99.       if(GPRS.CMD_BUFLen<13){
  100.         GPRS.LAC[0]=0xFF;
  101.         GPRS.LAC[1]=0xFF;
  102.         GPRS.CI[0]=0xFF;
  103.         GPRS.CI[1]=0xFF;
  104.       }else{
  105.         GPRS.LAC[0]=(AscToHex(GPRS.CMD_BUF[13])<<4)|AscToHex(GPRS.CMD_BUF[14]);
  106.         GPRS.LAC[1]=(AscToHex(GPRS.CMD_BUF[15])<<4)|AscToHex(GPRS.CMD_BUF[16]);
  107.         GPRS.CI[0]=(AscToHex(GPRS.CMD_BUF[20])<<4)|AscToHex(GPRS.CMD_BUF[21]);
  108.         GPRS.CI[1]=(AscToHex(GPRS.CMD_BUF[22])<<4)|AscToHex(GPRS.CMD_BUF[23]);
  109.       }
  110.       if((GPRS.Status==2)||(GPRS.Status==4)){
  111.         GPRS.RunStatus=1;
  112.         GPRS.Timer_CMD_Begin=10;
  113.         if(Debug.GSM_T==1)DebugPrintf("GSM小区切换\r\n",0,0);
  114.       }
  115.     }
  116. //------------------------------------------------------------------------------
  117.     if(GPRS.Status<2){
  118.       if(AT_Set[GPRS.InitStatus].IsSub==0){
  119.         if(OKTP(AT_Set[GPRS.InitStatus].RX)){
  120.           GPRS.InitStatus=AT_Set[GPRS.InitStatus].AT_CMD_Next;
  121.           GPRS.Init_CMDTP=0;
  122.           GPRS.Timer_CMD_Begin=10;
  123.         }else{
  124.         }
  125.       }else{
  126.         AT_Set[GPRS.InitStatus].Subs(GPRS.InitStatus,GPRS.CMD_BUFLen,GPRS.CMD_BUF);
  127.       }
  128.     }else if((GPRS.Status==2)||(GPRS.Status==4)){//信号、状态、发数
  129.         switch(GPRS.RunStatus)
  130.         {
  131.         case 0://网络状态
  132.             if(OKTP("STATE: IP PROCESSING")){
  133.               GPRS.RunStatus=1;
  134.               GPRS.Init_CMDTP=0;
  135.               for(i=0;i<GPRS.CMD_BUFLen;i++)GPRS.CMDM_BUF[i]=GPRS.CMD_BUF[i];
  136.               GPRS.Timer_CMD_Begin=10;
  137.               GPRS.CMD_Repeat=0;
  138.             }
  139.           break;
  140.         case 1://信号
  141.             if(OKTP("+CENG: 1,1")){
  142.               GPRS.RunStatus=0;
  143.               GPRS.Init_CMDTP=0;
  144.               for(i=0;i<GPRS.CMD_BUFLen;i++)GPRS.CMDM_BUF[i]=GPRS.CMD_BUF[i];
  145.               GPRS.Timer_CMD_Begin=10;
  146.               GPRS.CMD_Repeat=0;
  147.             }
  148.           break;
  149.         case 2://信号
  150.             if(OKTP("+CSQ:")){
  151.               GPRS.RunStatus=2;
  152.               GPRS.Init_CMDTP=0;
  153.               for(i=0;i<GPRS.CMD_BUFLen;i++)GPRS.CMDM_BUF[i]=GPRS.CMD_BUF[i];
  154.               GPRS.Timer_CMD_Begin=10;
  155.               GPRS.CMD_Repeat=0;
  156.             }
  157.           break;
  158.         }
  159.     }
  160.   }
  161. }


  162. void GPRS_Init(void)//模块初始化
  163. {
  164.   u8 i;
  165.   //if((GPRS.Status==2)||(GPRS.Status==4))return;//?需验证
  166.   if(GPRS.Timer_CMD_Begin>0)return;//每条命令前等待上条命令接收结束时间10ms
  167.   if((GPRS.Init_CMDTP==1)&&(GPRS.Timer_CMD!=0)){
  168.     return;//等待命令回复
  169.   }else if((GPRS.Init_CMDTP==1)&&(GPRS.Timer_CMD==0)){//超时重头初始化
  170.     GPRS.InitStatus=AT;
  171.     GPRS.Status=0;
  172.     if(Debug.GSM_T==1)DebugPrintf("AT命令超时错误:",0,0);
  173.   }
  174.   GPRS.Timer_CMD=AT_Set[GPRS.InitStatus].TimeOut/10;//等待时间
  175.   for(i=0;i<4;i++)GPRS.CMD_BUF[i]=0;
  176.   GPRS.Init_CMDTP=1;//命令忙
  177.   USART_DMA_TX(GPRS_USART,strlen((const char *)AT_Set[GPRS.InitStatus].TX),AT_Set[GPRS.InitStatus].TX);//发送数据
  178.   if((GPRS.InitStatus==AT_CIICR)&&(GPRS.InitRST<0xFE))GPRS.InitRST++;
  179.   if(Debug.GSM_T==1)USART_DMA_TX(Debug.Usart,strlen((const char *)AT_Set[GPRS.InitStatus].TX),AT_Set[GPRS.InitStatus].TX);
  180. }
  181. void GSM2W_Proc(void)//主程序循环
  182. {
  183.   if(GPRS.Status<2){
  184.     GPRS_Init();
  185.   }else{
  186.     if(GPRS.Timer_CIPSTATUS==0){
  187.       GPRS_Status();
  188.       GPRS.Timer_CIPSTATUS=150;
  189.     }
  190.     if((GPRS.LAC[0]!=GPRS.OldLAC[0])||(GPRS.LAC[1]!=GPRS.OldLAC[1])||(GPRS.CI[0]!=GPRS.OldCI[0])||(GPRS.CI[1]!=GPRS.OldCI[1])){
  191.       //网络状态变化记录
  192.       GPRS.OldLAC[0]=GPRS.LAC[0];
  193.       GPRS.OldLAC[1]=GPRS.LAC[1];
  194.       GPRS.OldCI[0]=GPRS.CI[0];
  195.       GPRS.OldCI[1]=GPRS.CI[1];
  196.     }
  197.   }
  198.   if(GPRS.InitRST>deN_GSMInitRstNum){
  199.           GSM_EN=0;
  200.           //GSM_RST=0;
  201.           delay_ms(500);
  202.           //GSM_RST=1;
  203.           GSM_EN=1;
  204.           GPRS.InitRST=0;
  205.           //断开连接
  206.           GPRS.Status=0;
  207.           GPRS.CIPSTART=0;
  208.           GPRS.InitStatus=AT;
  209.           if(Debug.GSM_T==1)DebugPrintf("GPRS模块复位\r\n",0,0);
  210.   }
  211.   GSM_RX_Proc();//gprs数据处理
  212. }





  213. .h

  214. typedef enum
  215. {
  216.   AT,               
  217.   ATE0,//关闭恢复显示
  218.   AT_IFC,
  219.   AT_EXUNSOL,
  220.   AT_CGREG_SET,//设置自动上报网络状态
  221.   AT_CENG,//设置自动上报网络状态
  222.   AT_CGREG,//查询网络状态
  223.   AT_CIPSHUT,//关闭已从场景
  224.   AT_CIPMUX,//设置多路连接
  225.   AT_CIPHEAD, //显示接收到的数据包的IP头
  226.   AT_CIPSRIP, //显示发送端的IP地址和端口
  227.   AT_CIPSPRT,//设置发送回示符
  228.   AT_CIPQSEND,
  229.   AT_CSTT,
  230.   AT_CIICR,//
  231.   AT_CIFSR,//
  232.   AT_CDNSGIP0,//
  233.   AT_CDNSGIP1,//
  234.   AT_CDNSGIP2,//
  235.   AT_CIPSTART0,
  236.   AT_CIPSTART1,
  237.   AT_CIPSTART2,
  238.   AT_END,
  239. }
  240. GMSInitState;

  241. typedef struct _AT_STRUCT
  242. {
  243.   uint32_t      TimeOut;//超时时间
  244.   uint8_t       IsSub;//是否执行扩展程序0不执行
  245.   uint8_t       RepNums;//重试次数
  246.   GMSInitState  AT_CMD_Err;//复位命令
  247.   GMSInitState  AT_CMD_Next;//执行1
  248.   uint8_t       *TX;//
  249.   uint8_t       *RX;//接收1
  250.   uint8_t       *RXE;//接收err
  251.   void (*Subs)(u8,u8,u8 *);//
  252. }AT_STRUCT;

  253. typedef struct _GPRS_TypeDef
  254. {
  255.   GMSInitState InitStatus;       //初始化状态标记
  256.   uint8_t  Power;            //0关1开
  257.   uint8_t  Status;            //网络状态标记0上电,1初始化完毕,2链接(掉线初始化过程)3链接,改变网络连接,4正常,定向连接正常。
  258.   uint8_t  Init_CMDTP;        //发送初始化命令有效标记
  259.   uint8_t  CIPSTART;          //网络连接ip0广播1定向
  260.   uint8_t  RunStatus;         //0查询网络状态,1查询信号,2信号提取,3发数中
  261.   uint8_t  IP_Local[16];//本地IP字符串
  262.   uint8_t  IP_Remote[16];//目标IP字符串
  263.   uint8_t  CSQ;//BCD
  264.   uint8_t  LAC[2];
  265.   uint8_t  CI[2];
  266.   uint8_t  OldLAC[2];
  267.   uint8_t  OldCI[2];
  268.   uint8_t  TX_func;//发送数据功能码
  269.   uint8_t  TX_Status;//发送状态0无数据发送,1发送中等待">",3发送完毕,4发送错误
  270.   uint8_t  TX_Repeat;//发送重复条数
  271.   uint16_t Serial;//流水号
  272.   uint8_t  InitRST;//模块卡死复位
  273.   uint16_t  DTMF_Password;//DTMF密码
  274.   uint8_t  Password_OK;//
  275.   
  276.   uint8_t  CMD_Repeat;//重试次数
  277.   uint8_t  CMDM_BUFLen;//接收命令处理buf长度
  278.   uint8_t  CMDM_BUF[128];//接收命令处理buf长度
  279.   uint8_t  CMD_Status;//接收命令判断
  280.   uint8_t  CMD_Len;//接收命令判断
  281.   uint8_t  CMD_BUFLen;//接收命令判断
  282.   uint8_t  CMD_BUF[128];//接收命令判断
  283.   
  284. __IO uint32_t   Timer_CIPSTATUS;//查询状态时间
  285. __IO uint32_t   Timer_CMD;//gprs初始化超时时间
  286. __IO uint32_t   Timer_CMD_Begin;//每条命令前等待上条命令接收结束时间10ms
  287. __IO uint32_t   Timer_Waitfor;
  288. }GPRS_TypeDef;

复制代码

出0入0汤圆

发表于 2018-6-28 20:24:03 | 显示全部楼层
考验功力,异常处理
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-3 10:13

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表