当前位置:   article > 正文

网络模块AT指令发送接收例程_c语言实现接收at指令返回

c语言实现接收at指令返回

普通代码发送at指令的,至少我去年搜这方面资料的时候,很多都是堵塞性的,主体框架大部分是

:send AT    rec ok       send  ATEO  rec  OK   ... 将连接网络的at流程全部走一遍,然后再正常调用网络发送接收的数据。这样就是堵塞式的收发流程。尤其在低功耗场景下。设备发送完就立刻低功耗,这样堵塞的时间占比明显就过高。故此退出以下框架。

  1. /*
  2. * 作者: GG
  3. * 邮箱: guotaoyuan1998@163.com
  4. * VX: qingya_1998
  5. * 创建日期: 22/08/17
  6. * 更新日期: 22/08/18
  7. * 版本: V1.3
  8. * 更新说明:
  9. * (BETA):增加了指令错误多次后的处理函数
  10. * (BETA):统一的失败判定,默认为重发,特殊需求自改
  11. * (V1.3):新增了部分地方注释,将大部分要移植微调的部分加入标识(GG修改@GSM)区别
  12. * 与之前写的库。
  13. * (V1.3):新增了csq,ccid等外部接口
  14. * ps: 计划下个版本内容:外部接口多场景测试,除了AT和ATE的action判定修改
  15. *
  16. * 使用方式: 调用 g_GsmWork.send();-> g_GsmWork.rec(USART_RX_BUF); (推荐可以在串口完成标志判断后调用)
  17. * -> 对应界面逻辑方面修改,尤其是标识部分
  18. */
  19. #define AT_SENDDATA printf
  20. static GG_GsmSignSta_TypeDef s_AT_SignSta;
  21. static GG_GsmSendSta Gsm_SignRecHandleCallback(unsigned char *buf);//接收处理(GG修改@GSM)
  22. typedef struct
  23. {
  24. GG_ATStepName Step;//当前步骤
  25. GG_ATStepName NextStep;//下一步骤
  26. void (*action)();//当前步骤指令发送
  27. void (*outTimeAction)(); //超时处理
  28. void (*delAction)(); //多次超时错误处理
  29. uint16_t outtime;//超出单位时间
  30. uint16_t outtimeloop;//超时错误次数
  31. }GG_ATWORK_TypeDef;
  32. static GG_ATWORK_TypeDef s_atBobyHandleMap[] =
  33. {
  34. {AT,ATEO,AT_Action,OutTimeAction,DelAction,100,5},
  35. {ATEO,CCID,ATEO_Action,OutTimeAction,DelAction,100,5},
  36. {CCID,CGDCONT,CCID_Action,OutTimeAction,DelAction,100,5},
  37. {CGDCONT,CSQ,CGDCONT_Action,OutTimeAction,DelAction,100,5},
  38. {CSQ,CREG,CSQ_Action,OutTimeAction,DelAction,100,5},
  39. {CREG,QMTCFG,CREG_Action,OutTimeAction,DelAction,100,5},
  40. {QMTCFG,QMTOPEN,QMTCFG_Action,OutTimeAction,DelAction,100,5},
  41. {QMTOPEN,QMTCONN,QMTOPEN_Action,OutTimeAction,DelAction,100,5},
  42. {QMTCONN,QMTSUB,QMTCONN_Action,OutTimeAction,DelAction,100,5},
  43. {QMTSUB,QMTPUBEX,QMTSUB_Action,OutTimeAction,DelAction,100,5},
  44. {QMTPUBEX,ATWAIT,QMTPUBEX_Action,OutTimeAction,DelAction,100,5},
  45. {QMTPUBEX,ATWAIT,QMTPUBEX_Action,OutTimeAction,DelAction,100,5},
  46. };//(GG修改@GSM)
  47. GG_GsmWork_TypeDef g_GsmWork =
  48. {
  49. Gsm_Process_Send,
  50. Gsm_Process_Rec,
  51. };

如上代码所示,MAP第一个属性是第一个步骤,第二个属性是下一步,之后就是对应的处理,超时或错误处理,和多次超时错误处理。最后是时间和错误允许次数

用的时候自行添加步骤和下一步。

  1. static void AT_Action(void)
  2. {
  3. AT_SENDDATA("AT\r\n");
  4. }
  5. static void ATEO_Action(void)
  6. {
  7. AT_SENDDATA("ATEO\r\n");
  8. }
  9. static void CCID_Action(void)
  10. {
  11. AT_SENDDATA("AT+CCID\r\n");
  12. }
  13. static void CGDCONT_Action(void)
  14. {
  15. AT_SENDDATA("AT+CGDCONT?\r\n");
  16. }

action里面如上代码,自行填入处理,这样做增加了代码量但是维护起来无疑更方便,可以直接跳转,并对特殊指令自行拼接。

  1. static GG_GsmSendSta Gsm_SignRecHandleCallback(unsigned char *buf)
  2. {
  3. //uint8_t sta;
  4. char *p;
  5. switch(s_AT_SignSta.Step)
  6. {
  7. case AT:
  8. {
  9. if(NULL != (p = strstr( (char*)buf,"OK")))
  10. {
  11. //printf("1111");
  12. return WAIT;
  13. }
  14. else
  15. {
  16. return ERR;
  17. }
  18. break;
  19. }
  20. case ATEO:
  21. {
  22. if(NULL != (p = strstr( (char*)buf,"OK")))
  23. {
  24. //printf("1111");
  25. return WAIT;
  26. }
  27. else
  28. {
  29. return ERR;
  30. }
  31. break;
  32. }

之后在上述代码中修改如何判定字符返回是否正确,目前由于初次写,当前框架是ok都算对,后续可以改代码字符“ok”来匹配不同指令回复,因为指令回复和发送不同,回复的变数比较小,基本属于定值,除了接收数据协议帧,所以用了一个长的switch case

  1. //用户接口
  2. //信号,ccid,获取写入
  3. void Gsm_GSQSetData(uint8_t csq);
  4. uint8_t Gsm_GetCSQData(void);
  5. void Gsm_CCIDSetData(uint8_t *buf);
  6. uint8_t* Gsm_GetCCIDData(void);
  7. //联网后发送数据
  8. void Gsm_NetSendData(uint8_t *buf);
  9. //网络连接成功标志,自行放在at指令发送处理中
  10. void Gsm_NetWorkStaSetBit(void);

用户接口除了刚刚说的,也就这块要修改了,ccid和csq读取等接口,因为是初测,没有写这块函数处理,只开通的读取和写入的接口。

测试平台stm32f1,移植在原子基本例程

 

发送错误或者超时都会重发,五次后会重新发at(这个多次超时接口默认的重新开始,其他功能比如模块断电啥,可以自己从map跳转修改)

 该框架原则将驱动和应用层分离。用户调用方便调用方法见本人git链接https://github.com/gglingyishu/AT_INSTRUCT

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/菜鸟追梦旅行/article/detail/410631
推荐阅读
相关标签
  

闽ICP备14008679号