AT-Command/docs/readme.md

67 lines
3.7 KiB
Markdown
Raw Normal View History

2022-12-31 22:42:31 +08:00
# 简介
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)