随着 AT 命令的逐渐普及,越来越多的嵌入式产品上使用了 AT 命令,一般AT 命令作为主芯片和通讯模块的协议接口,硬件接口一般为串口,这样主控设备可以通过简单的命令和硬件设计完成多种操作。
但是不同厂家的不同 AT 命令之间还是没有完全的标准化,这直接提高了用户使用的复杂性。对于 AT 命令的发送和接收以及数据的解析没有统一的处理方式,并且在使用 AT 设备连接网络时,只能通过命令完成简单的设备连接和数据收发功能,很难做到对上层网络应用接口的适配,不利于产品设备的开发。
为了方便用户使用 AT 命令,并且适配不同厂家的不同设备, RT-Thread 提供了 AT 组件用于 AT 设备的连接和数据通讯。AT 组件的使用包括客户端的和服务器,对于嵌入式设备而言,更多的情况下设备使用 AT 组件作为客户端连接服务器设备,所以本文将为大家介绍 AT 组件中客户端的原理、移植方式和主要功能使用,并介绍在客户端的基础上实现标准 BSD Socket API,使用 AT 命令进行网络通讯。
本应用笔记将从以下几个方面来介绍 RT-Thread AT 组件:
本应用笔记将围绕下面几个问题来介绍 RT-Thread AT 组件。
想要解决这些问题,就要了解 RT-Thread AT 组件基本原理和功能使用方式。下面就从 RT-Thread AT 组件 AT Client 原理开始逐步介绍 配置方式、移植以及功能使用,使用户快速上手 AT 组件的 AT Client 功能。
AT 命令是一种应用于 AT 客户端(AT Client)与 AT 服务器(AT Server)间的设备连接与数据通信的方式。 其基本结构如下图所示:
3.1.1 AT 命令基本概念
一般 AT 命令由三个部分组成,分别是:前缀、主体和结束符。其中前缀由字符 AT 构成;主体由命令、参数和可能用到的数据组成;结束符一般为
("\r\n")。
AT 功能的实现需要 AT Server 和 AT Client 两个部分共同完成;
AT Server 主要用于接收 AT Client 发送的命令,判断接收的命令及参数格式,并下发对应的响应数据,或者主动下发数据;
AT Client 主要用于发送命令、等待 AT Server 响应,并对 AT Server 响应数据或主动发送的数据进行解析处理,获取相关信息。
AT Client 和 AT Server 之间支持多种数据通讯的方式(UART、SPI等),目前最常用的是串口 UART 通讯方式。
AT Client 接收到的数据类型分成两种:响应数据和 URC 数据。
3.1.2 AT 组件介绍
AT 组件是基于 RT-Thread 系统的 AT Server
和 AT Client
的实现,组件完成 AT 命令的发送、命令格式及参数判断、命令的响应、响应数据的接收、响应数据的解析、URC 数据处理等整个 AT 命令数据交互流程。
通过 AT 组件,设备可以作为 AT Client 使用串口连接其他设备完成数据的发送、接收与解析,可以作为 AT Server 让其他设备甚至 PC 设备连接完成数据的响应,也可以在本地 shell 启动 CLI 模式使设备同时支持 AT Server 和 AT Clinet 功能,该模式多用于设备开发调试。
本文将基于正点原子 STM32F4 探索者开发板和乐鑫 ESP8266 开发板,给出了 AT 组件中 AT Client 功能的配置、移植和使用方式。
下图为本文使用的两个开发板的底板图,开发者可以使用 ESP8266 开发板或模组,若缺少正点原子 STM32F4 探索者开发板可使用其他带额外串口的开发板代替,需确保开发板正常运行 RT-Thread 系统且串口使用正常即可:
AT 组件中 AT Client 主要完成 AT 命令的发送和响应数据的接收与解析。这里我们使用正点原子 STM32F4 探索者开发板串口 2 作为 AT Client 连接 ESP8266 开发板的串口 2,ESP8266 开发板的串口 2 作为 AT Server,完成 AT Client 数据收发和解析的功能,下面就具体给出配置、移植和使用方式的介绍。
3.2.1 AT Client 配置
1.下载 RT-Thread 源码
2.下载 env 工具
3.开启 env 工具,进入 rt-thread\bsp\stm32f4xx-HAL 目录,在 env 命令行输入 menuconfig 进入配置界面配置工程。
配置 shell 设备:RT-Thread Kernel ---> Kernel Device Object ---> 修改 the device name for console 为 uart1
,配置 shell 默认设备为串口 1。
开启 AT Client 功能:RT-Thread Components ---> Network ---> AT commands --> 开启 AT DEBUG,开启 AT Client 支持,设置 AT Client 使用设备为串口 2。
AT Client 配置选项介绍如下:
4.配置完成,保存并退出配置选项,输入命令 scons --target=mdk5 生成 keil 工程;
3.2.2 AT Client 移植
AT Client 的移植主要是对 URC 数据(服务器主动下发数据)的处理,实现获取不同的 URC 数据时执行相应的操作函数的功能。
如下函数为 AT Client 移植初始化函数,AT 组件源码 src/at_client.c
文件中给出了移植初始化函数的弱函数定义,用户可在项目中新建移植文件实现如下函数完成移植接口,也可以直接在源码文件中修改弱函数完成移植接口。
int at_client_port_init(void);
对于 URC 数据,AT 组件中已经提供完善的 URC 数据判断和处理方式,下面给出 AT Client 移植具体示例,该示例主要展示 at_client_port_init()
移植函数中 URC 数据的具体处理方式,用户可直接复制应用到自己的移植文件中,或者进行自定义修改实现功能,最终完成 AT Client 的移植。
注: "OK" 和 "ERROR" 为正常命令响应结果判断字符串,切勿作为 URC 数据设置到 URC 列表中。
/* URC 数据相关结构体定义 */ struct at_urc { const char *cmd_prefix; //URC 数据前缀 const char *cmd_suffix; //URC 数据后缀 void (*func)(const char *data, rt_size_t size); //URC 数据执行函数 }; static void urc_func(const char *data, rt_size_t size) { /* 自定义 URC 数据处理方式 */ LOG_D("URC data : %.*s", size, data); } static struct at_urc urc_table[] = { {"ready", "\r\n", urc_func}, {"WIFI CONNECTED", "\r\n", urc_func}, {"WIFI DISCONNECT", "\r\n", urc_func}, }; int at_client_port_init(void) { /* 添加多个 URC 结构体至 URC 列表中,当接收到同时匹配 URC 前缀和后缀的数据,执行 URC 函数 */ at_set_urc_table(urc_table, sizeof(urc_table) / sizeof(urc_table[0])); return RT_EOK;
3.2.3 AT Client 示例添加
下载 AT Client 示例代码,添加到打开的 keil 工程中,如下图所示:
示例添加完成,就可以编译、下载程序到开发板,之后打开 PC 上串口工具,这里使用 xshell 工具,选择正确的串口(配置串口参数为 115200-8-1-N、无流控),然后按下复位后就可以在串口 1 连接的终端上看到 RT-Thread 系统启动日志,并可以看到 AT Client 的启动日志,说明 AT Client 功能配置启动成功,如下图所示:
阅读全文请点击:https://www.rt-thread.org/document/site/rtthread-application-note/components/at/an0014-rtthread-system-at-client/