RT-Thread学习之AT组件

AT命令简介

AT命令最早是由发明拨号调制解调器(MODEM)的贺氏公司(Hayes)为了控制MODEM而发明的控制协议。而由于MODEM速度很低,慢慢退出一般使用市场,但是AT命令保留下来。
AT 命令在此基础上演化并加入 GSM 07.05 标准以及后来的 GSM 07.07 标准,实现比较健全的标准化。
在随后的GPRS控制、3G模块等方面,均采用的AT命令来控制,AT命令逐渐在产品开发中称为实际的标准。如今AT命令也广泛地应用于嵌入式开发领域,AT命令作为主芯片和通讯模块协议接口,硬件接口一般为串口,这样主控设备可以通过简单的命令和硬件设计完成多种操作。

AT命令集是一种应用于AT服务器(AT Server)与AT客户端(AT Client)间的设备连接与数据通信的方式,其基本结构如下图所示:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-23BPl5Jm-1595323942069)(https://www.rt-thread.org/document/site/programming-manual/at/figures/at_framework.jpg)]

特点:

  • 一般AT命令由三个部分组成。分别是:前缀、主体和结束符。其中前缀由字符AT构成;主体由命令、参数和可能用到的数据组成;结束符一般为 ("\r\n")。
  • AT功能的实现需要AT Server和AT Client两个部分共同完成。
  • AT Sever主要用于接收AT Client 发送的命令,判断接收的命令及参数格式,并下发对应的响应数据,或者主动下发数据。
  • AT Client 主要用于发送命令、等待 AT Server 响应,并对 AT Server 响应数据或主动发送的数据进行解析处理,获取相关信息。
  • AT Server 和 AT Client 之间支持多种数据通讯的方式(UART、SPI 等),目前最常用的是串口 UART 通讯方式。
  • AT Server 向 AT Client 发送的数据分成两种:响应数据URC 数据
  • 响应数据: AT Client 发送命令之后收到的 AT Server 响应状态和信息。
  • URC 数据: AT Server 主动发送给 AT Client 的数据,一般出现在一些特殊的情况,比如 WIFI 连接断开、TCP 接收数据等,这些情况往往需要用户做出相应操作。

RT-Thread AT组件简介

为了方便用户使用AT命令,简单的适配不同的AT模块,RT-Thread提供了AT组件用于AT设备的连接和数据通讯。
AT组件是基于RT-Thread系统的AT Server和AT Client的实现,组件完成AT命令的发送、命令格式及参数判断、命令的响应、响应数据的接收、响应数据的解析、URC数据处理等整个AT命令数据交互流程。

AT Server 主要功能特点:

  • 基础命令: 实现多种通用基础命令(ATE、ATZ 等);
  • 命令兼容: 命令支持忽略大小写,提高命令兼容性;
  • 命令检测: 命令支持自定义参数表达式,并实现对接收的命令参数自检测功能;
  • 命令注册: 提供简单的用户自定义命令添加方式,类似于 finsh/msh 命令添加方式;
  • 调试模式: 提供 AT Server CLI 命令行交互模式,主要用于设备调试。

AT Client 主要功能特点:

  • URC 数据处理: 完备的 URC 数据的处理方式;
  • 数据解析: 支持自定义响应数据的解析方式,方便获取响应数据中相关信息;
  • 调试模式: 提供 AT Client CLI 命令行交互模式,主要用于设备调试。
  • AT Socket:作为 AT Client 功能的延伸,使用 AT 命令收发作为基础,实现标准的 BSD * Socket API,完成数据的收发功能,使用户通过 AT 命令完成设备连网和数据通讯。
  • 多客户端支持: AT 组件目前支持多客户端同时运行。
AT Server
AT Server配置

当我们使用AT组件中的AT Server功能时需要在rtconfig.h中定义相关配置。
对于不同的 AT 设备,发送命令的行结束符的格式有几种: “\r\n”、"\r"、"\n",用户需要根据 AT Server 连接的设备类型选用对应的行结束符,进而判断发送命令行的结束。

AT Server初始化

配置开启AT Server配置之后,需要在启动时对它进行初始化,开启AT Server功能,如果程序中已经使用了组件自动初始化,则不再需要额外进行单独的初始化,否则需要在初始化任务中调用如下函数:

int at_server_init(void);
  • AT Server目前支持的基础命令如下:
  • AT:AT 测试命令;
  • ATZ:设备恢复出厂设置;
  • AT+RST:设备重启;
  • ATE:ATE1 开启回显,ATE0 关闭回显;
  • AT&L:列出全部命令列表;
  • AT+UART:设置串口设置信息。

AT命令根据传入的参数格式不同可以实现不同的功能,对于每个AT命令最多包含四种功能,如下所述:

  • 测试功能:AT+=? 用于查询命令参数格式及取值范围;
  • 查询功能:AT+? 用于返回命令参数当前值;
  • 设置功能:AT+=… 用于用户自定义参数值;
  • 执行功能:AT+ 用于执行相关操作。
AT Server API接口
发送数据至客户端(不换行)
void at_server_printf(const char *format, ...);

该函数用于AT Server通过串口设备发送固定格式的数据到对应的AT Client串口设备上,数据结尾不带换行符。用于自定义AT Server中AT命令的功能函数中。

发送数据至客户端(换行)
void at_server_printfln(const char *format, ...);
发送命令执行结果至客户端
void at_server_print_result(at_result_t result);

该函数用于 AT Server 通过串口设备发送命令执行结果到对应的 AT Client 串口设备上。

解析输入命令参数
int at_req_parse_args(const char *req_args, const char *req_expr);
AT Client
AT Client配置

当我们使用 AT 组件中的 AT Client 功能是需要在 rtconfig.h 中定义。

AT Client初始化

配置开启AT Client配置之后,需要在启动时对它进行初始化,开启AT Client功能。

int at_client_init(const char *dev_name,  rt_size_t recv_bufsz);
AT Client 数据收发方式

AT client主要功能是发送AT命令、接收数据并解析数据。相关结构体定义:

struct at_response
{
    /* response buffer */
    char *buf;
    /* the maximum response buffer size */
    rt_size_t buf_size;
    /* the number of setting response lines
     * == 0: the response data will auto return when received 'OK' or 'ERROR'
     * != 0: the response data will return when received setting lines number data */
    rt_size_t line_num;
    /* the count of received response lines */
    rt_size_t line_counts;
    /* the maximum response time */
    rt_int32_t timeout;
};
typedef struct at_response *at_response_t;

相关API接口介绍:
创建响应结构体:

at_response_t at_create_resp(rt_size_t buf_size, rt_size_t line_num, rt_int32_t timeout);

删除响应结构体

void at_delete_resp(at_response_t resp);

设置响应结构体参数

at_response_t at_resp_set_info(at_response_t resp, rt_size_t buf_size, rt_size_t line_num, rt_int32_t timeout);

发送命令并接收响应

rt_err_t at_exec_cmd(at_response_t resp, const char *cmd_expr, ...);
AT Client URC数据处理

URC数据的处理是AT Client另一个重要功能,URC数据为服务器主动下发的数据,不能通过上述数据发送接收函数接收,并且对于不同设备URC数据格式和功能不一样,所以URC数据处理的方式也是需要用户自定义实现的。
AT 组件中对 URC 数据的处理提供列表管理方式,用户可自定义添加 URC 数据和其执行函数到管理列表中,所以 URC 数据的处理也是 AT Client 的主要移植工作。
相关结构体:

struct at_urc
{
    const char *cmd_prefix;             // URC 数据前缀
    const char *cmd_suffix;             // URC 数据后缀
    void (*func)(const char *data, rt_size_t size);     // URC 数据执行函数
};
typedef struct at_urc *at_urc_t;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值