mirror of
https://gitee.com/moluo-tech/AT-Command.git
synced 2025-01-15 17:02:53 +08:00
简介
AT command(V2) 一款管理AT命令通信交互组件, 适用于Modem、WIFI模块、蓝牙等使用AT命令或者ASCII命令行通信的场景,它涵盖了大部分AT通信形式,如参数设置,查询,二进制数据发送等,同时也支持自定义命令交互管理,由于它的每个命令请求都是异步的,所以对于无操作系统的环境也支持。相对于V1版本,新版本在命令接收匹配,URC不定长度数据捕获以及内存安全上做了大量优化,让它可以应对更多复杂产品应用。
下面是一个最基本使用的演示:
/**
* @brief 命令响应处理程序
*/
static void read_csq_callback(at_response_t *r)
{
int rssi, ber;
//+CSQ: <rssi>,<ber>
if (r->code == AT_RESP_OK) {
//命令响应成功后,解析出rssi,ber.
if (sscanf(r->prefix, "+CSQ:%d,%d", &rssi, &ber) == 2) {
printf("rssi:%d, ber:%d\r\n", rssi, ber);
}
} else {
printf("'CSQ' command response failed!\r\n");
}
}
/**
* @brief 读CSQ值请求
*/
static void read_csq(void)
{
//发送CSQ查询命令,超时时间为1000ms,重发次数为0
at_send_singlline(at_obj, read_csq_callback, 1000, 0, "AT+CSQ");
}
上面的示例展示了AT命令通信的基本使用方式:
- 命令请求:执行命令发送之后,命令并不会立即从数据通道发送出去,而是先进入命令队列。
- 异步通知:无论命令执行成功与否,都会以异步方式通知请求者。
框架介绍
整个组件由两部分内容组成:
- AT 作业管理, 管理所有AT异步请求及命令收发工作。
- URC(主动上报) 处理模块,实时捕获URC消息并上报事件,它跟AT作业是并行的,是一个可选的模块。
AT 作业
'AT Command'组件的基本处理单元是AT作业, 它实际上是一个状态机轮询程序,不仅仅可以处理单个命令收发,还可以是批量命令,自定义命令等,应用程序在进行AT通信请求时,系统会根据请求类型生成一个新的作业对象,然后将对象按照执行优先级预先缓存到队列中,接着系统会从队列逐个取出并选择相应的状态机处理程序进行处理,处理完毕之后再以回调方式将结果上报给应用程序,整个环节跟流水作业生产产品一样,它的基本处理流程图如下所示:
AT作业生命周期
AT作业生命周期可以简单分为五个阶段:创建阶段、就绪阶段、运行阶段、完成/终止阶段、销毁阶段。
- 创建阶段: 根据请求类型生成作业项,这个阶段可以为新作业项绑定一个上下文,用来监视作业的整个工作过程,包含运行状态,AT命令响应信息等.
- 就绪阶段: 作业被提交入队列之后就进入了就绪状态,系统按队列顺序一个接着一个取出来并运行.
- 运行阶段: 此时进入运行一个状态机,以一般AT命令为例,它包含了命令发送,数据接收匹配,超时重试等处理.
- 完成/终止阶段: 当命令请求的响应信息匹配成功之后,则进入完成状态,如果在这之前命令请求被提示终止,则进入终止状态。
- 销毁阶段: 在这个阶段系统会将作业从队列中移出同时将相关内存释放.
URC 处理模块
URC 处理模块可以实时捕获URC消息,上层应用需要提供URC消息的匹配规则(消息前后缀)及事件处理入口,它们共同组成了URC订阅表,一旦URC解析器匹配到表中某项规则时,立即以事件方式返回给订阅者进行处理(有关这部分的使用可以参考URC消息处理)。