当前位置:   article > 正文

AT指令代码与实现方法(基于C语言)_c语言实现at指令

c语言实现at指令

WiFi、蓝牙、4G等多种通信模块均需使用AT指令进行配置和通信。基于μCOSIII操作系统,写了个AT指令的代码,也可以简单修改后用于裸奔系统。简单介绍一下,完整代码下载链接为:

https://download.csdn.net/download/hnxyxiaomeng/10815656

1、AT配置结构体

设计了一个结构体stcATConfig,可以对发送的每个指令分别进行配置。

  1. typedef struct
  2. {
  3. uint16_t resp_time100ms;//发送后查询返回信息的延时,100ms为单位。可设为指令最大响应时间。
  4. uint8_t try_delay1ms; //发送失败后再次发送时的延时,1ms为单位
  5. uint8_t max_try_times; //最大重试次数
  6. uint8_t max_reset_times; //最大重启次数
  7. } stcATConfig;

2、AT指令注册函数

在发送AT指令之前,需要先注册AT指令的运行环境,包括如下4项。

  1. void AT_RegisterHandler(SendMsgFunc_t func, char* recv_buf, OS_SEM* recv_sem, OS_MUTEX* buf_mutex)
  2. {
  3. SendMsgCallback=func; //串口发送数据的函数
  4. pRecvAckSem = (OS_SEM*)recv_sem; //串口收到AT指令回令的信号量,可在串口接收空闲后发出
  5. pAckBufMux=(OS_MUTEX*)buf_mutex; //串口接收缓冲区互斥信号量
  6. atAckBuf = (char*)recv_buf; //串口接收缓冲区
  7. return;
  8. }

3、发送AT指令函数和发送AT字符数组函数

二者的主要区别是:

(1)发送AT指令函数主要用于发送AT配置命令,发送的都是字符串,发送函数遇到"\0"时就停止。发送AT字符数组函数主要用于发送数据,发送的时char型数组,遇到"\0"时不停止,且需指定发送的数组长度。比如,用EC20模块发布MQTT消息时,发完PUB命令后,就需要直接发送一个数组作为数据。

(2)发送AT指令函数在多次发送失败后,可以根据设置多次重启硬件。发送AT字符数组函数不重启硬件。

  1. /*****************************************************************
  2. * 功能:发送AT指令
  3. * 输入: send_buf:发送的字符串
  4. recv_str:期待回令中包含的子字符串
  5. p_at_config:AT配置
  6. * 输出:执行结果代码
  7. ******************************************************************/
  8. uint8_t AT_SendCmd(const char *send_str,const char *recv_str,stcATConfig *p_at_config)
  9. {
  10. ......
  11. }
  12. /*****************************************************************
  13. * 功能:发送数组数据
  14. * 输入: send_buf:发送的数组
  15. buf_len:数组长度
  16. recv_str:期待回令中包含的子字符串
  17. p_at_config:AT配置
  18. * 输出:执行结果代码
  19. ******************************************************************/
  20. uint8_t AT_SendData(const char *send_buf,const uint16_t buf_len,const char *recv_str,stcATConfig *p_at_config)
  21. {
  22. ......
  23. }

4、清空接收缓冲区和搜索响应字符串函数

均是局部函数,清空接收缓冲区函数在每次发送AT指令或数据前调用,搜索响应字符串函数在发送AT指令后调用。

  1. /*****************************************************************
  2. * 功能:查询AT指令的回令中是否有需要的字符串
  3. * 输入: recv_str:期待输出字符串中需要含有的子字符串,如"OK\r\n"
  4. max_resp_time:指令最大响应时间,单位100ms
  5. * 输出:查找到的子字符串指针
  6. ******************************************************************/
  7. char* AT_SearchRecvBuf(const char* recv_str,uint16_t max_resp_time)
  8. {
  9. ...
  10. }
  11. /******************************************
  12. * 功能:清空串口接收缓冲区
  13. ******************************************/
  14. void AT_ClearAckBuff(void)
  15. {
  16. ...
  17. }

5、举个例子

(1)先注册AT指令运行环境

AT_RegisterHandler(Uart_SendData,atAckBuf,&ATRecvAckSem,&ATRecvAckMux);

其中Uart_SendData是串口发送函数,符合typedef void (*SendMsgFunc_t)(uint8_t * buf, uint32_t len);的形式即可。

atAckBuf是串口接收数组char[],ATRecvAckSem和ATRecvAckMux分别是串口接收数据信号量和串口接收数组互斥信号量。

  1. OSSemCreate((OS_SEM*)&ATRecvAckSem,"ATRecvAckSem",0,&_err);
  2. OSMutexCreate((OS_MUTEX*)&ATRecvAckMux,"ATRecvAckMux",&_err);

(2)发送AT指令

  1. stcATConfig iotATConfig;
  2. stcATConfig * pATConfig = &iotATConfig;
  3. pATConfig->resp_time100ms = 1; //最大响应时间100ms
  4. pATConfig->try_delay1ms = 100; //响应失败后再次发送时延时100ms
  5. pATConfig->max_try_times = 10; //最大重试次数:10
  6. pATConfig->max_reset_times =0; //最大重启次数:0
  7. _ret = AT_SendCmd("ATI\r\n","OK\r\n",pATConfig);//发送"ATI\r\n"后,响应中包含"OK\r\n"才算响应正常
  8. ....
  9. pATConfig->resp_time100ms = 500; //最大响应时间50s
  10. pATConfig->try_delay1ms = 100; //响应失败后再次发送时延时100ms
  11. pATConfig->max_try_times = 10; //最大重试次数:10
  12. pATConfig->max_reset_times =0; //最大重启次数:10
  13. _ret = AT_SendCmd("******\r\n","\r\n+QMTOPEN:",p_AT_Config);//发送"***\r\n"后,响应中包含"\r\n+QMTOPEN:"才算响应正常

(3)发送AT数据

与发送AT指令类似,更简单,不举例了。

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

闽ICP备14008679号