mirror of
https://gitee.com/moluo-tech/AT-Command.git
synced 2025-01-15 17:02:53 +08:00
67 lines
3.7 KiB
Markdown
67 lines
3.7 KiB
Markdown
# 简介
|
||
AT command(V2) 一款管理AT命令通信交互组件, 适用于Modem、WIFI模块、蓝牙等使用AT命令或者ASCII命令行通信的场景,它涵盖了大部分AT通信形式,如参数设置,查询,二进制数据发送等,同时也支持自定义命令交互管理,由于它的每个命令请求都是异步的,所以对于无操作系统的环境也支持。相对于V1版本,新版本在命令接收匹配,URC不定长度数据捕获以及内存安全上做了大量优化,让它可以应对更多复杂产品应用。
|
||
|
||
|
||
下面是一个最基本使用的演示:
|
||
```c
|
||
/**
|
||
* @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处理框架](images/atfsm.png)
|
||
|
||
### AT作业生命周期
|
||
|
||
AT作业生命周期可以简单分为五个阶段:创建阶段、就绪阶段、运行阶段、完成/终止阶段、销毁阶段。
|
||
|
||
<img src="images/workfsm.png" alt="AT作业" style="zoom:75%;" />
|
||
|
||
- **创建阶段:** 根据请求类型生成作业项,这个阶段可以为新作业项绑定一个上下文,用来监视作业的整个工作过程,包含运行状态,AT命令响应信息等.
|
||
- **就绪阶段:** 作业被提交入队列之后就进入了就绪状态,系统按队列顺序一个接着一个取出来并运行.
|
||
- **运行阶段:** 此时进入运行一个状态机,以一般AT命令为例,它包含了命令发送,数据接收匹配,超时重试等处理.
|
||
- **完成/终止阶段:** 当命令请求的响应信息匹配成功之后,则进入完成状态,如果在这之前命令请求被提示终止,则进入终止状态。
|
||
- **销毁阶段:** 在这个阶段系统会将作业从队列中移出同时将相关内存释放.
|
||
|
||
## URC 处理模块
|
||
|
||
URC 处理模块可以实时捕获URC消息,上层应用需要提供URC消息的匹配规则(消息前后缀)及事件处理入口,它们共同组成了URC订阅表,一旦URC解析器匹配到表中某项规则时,立即以事件方式返回给订阅者进行处理(有关这部分的使用可以参考[URC消息处理](Expert.md#URC消息处理))。
|
||
|
||
![AT作业](images/urcflow.png)
|