AT Server

AT Server 配置

当我们使用 AT 组件中的 AT Server 功能时需要在 rtconfig.h 中定义如下配置:

  1. #define RT_USING_AT
  2. #define AT_USING_SERVER
  3. #define AT_SERVER_DEVICE "uart3"
  4. #define AT_SERVER_RECV_BUFF_LEN 256
  5. #define AT_CMD_END_MARK_CRLF
  6. #define AT_USING_CLI
  • RT_USING_AT: 用于开启或关闭 AT 组件;
  • AT_USING_SERVER: 用于开启 AT Server 功能;
  • AT_SERVER_DEVICE: 定义设备上 AT Server 功能使用的串口通讯设备名称,确保未被使用且设备名称唯一,这里使用的是 uart3 设备;
  • AT_SERVER_RECV_BUFF_LEN:定义 AT Server 设备最大接收数据的长度;
  • AT_CMD_END_MARK_CRLF: 定义用于判断接收命令的行结束符;
  • AT_USING_CLI: 用于开启或关闭服务器命令行交互模式。
    对于不同的 AT 设备,发送命令的行结束符的格式有几种: "\r\n"、"\r"、"\n",用户需要根据 AT Server 连接的设备类型选用对应的行结束符,进而判断发送命令行的结束, 定义的方式如下:
宏定义 结束符
AT_CMD_END_MARK_CRLF "\r\n"
AT_CMD_END_MARK_CR "\r"
AT_CMD_END_MARK_LF "\n"

AT 组件中还提供了如下两种调试功能,用户可以通过定义宏定义开启调试模式,或者开启实时显示数据模式:

  1. #define AT_DEBUG
  2. #define AT_PRINT_RAW_CMD
  • AT_DEBUG:用于开启 AT 组件 DEBUG 模式,可以显示更多调试日志信息。
  • AT_PRINT_RAW_CMD:用于开启实时显示 AT 命令通信数据模式,方便调试。
    上面配置选项可以直接在 rtconfig.h 文件中添加使用,也可以通过组件包管理工具 ENV 配置选项加入,ENV 中具体路径如下:
  1. RT-Thread Components --->
  2. Network --->
  3. AT commands --->
  4. [*] Enable AT commands
  5. [*] Enable debug log output
  6. [*] Enable AT commands server
  7. (uart3) Server device name
  8. (256) The maximum length of server data accepted
  9. The commands new line sign (\r\n) --->
  10. [ ] Enable AT commands client
  11. [*] Enable command-line interface for AT commands
  12. [ ] Enable print RAW format AT command communication data

添加配置完成之后可以使用命令行重新生成工程,或使用scons来进行编译生成。

AT Server 初始化

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

  1. int at_server_init(void);

AT Server 初始化函数,属于应用层函数,需要在使用 AT Server 功能或者使用 AT Server CLI 功能前调用。at_server_init 函数完成对 AT 命令存放数据段初始化、AT Server 设备初始化以及 AT Server 使用的信号量等资源的初始化,并创建 at_server 线程用于 AT Server 中数据的接收的解析。

AT Server 初始化成功之后,设备就可以作为 AT 服务器与 AT 客户端的串口设备连接并进行数据通讯,或者使用串口转化工具连接 PC,使 PC 端串口调试助手作为 AT 客户端与其进行数据通讯。

自定义 AT 命令添加方式

目前,不同厂家的 AT 设备使用的 AT 命令集的格式没有完全的统一的标准,所以 AT 组件中的 AT Server 只支持了部分基础通用 AT 命令,例如:ATE、AT+RST等,这些命令只能满足设备基本操作,用户想使用更多功能需要针对不同 AT 设备完成自定义 AT Server 命令,AT 组件提供类似于 finsh/msh 命令添加方式的 AT 命令添加方式,方便用户实现需要的命令。

AT Server 目前默认支持的基础命令如下:

  • AT:AT 测试命令;
  • ATZ:设备恢复出厂设置;
  • AT+RST:设备重启;
  • ATE:ATE1 开启回显,ATE0 关闭回显;
  • AT&L:列出全部命令列表;
  • AT+UART:设置串口设置信息。
    AT 命令根据传入的参数格式不同可以实现不同的功能,对于每个 AT 命令最多包含四种功能,如下所述:

  • 测试功能:AT+=? 用于查询命令参数格式及取值范围;

  • 查询功能:AT+? 用于返回命令参数当前值;
  • 设置功能:AT+=… 用于用户自定义参数值;
  • 执行功能:AT+ 用于执行相关操作。
    每个命令的四种功能并不需要全部实现,用户自定义添加 AT Server 命令时,可根据自己需求实现一种或几种上述功能函数,未实现的功能可以使用 NULL 表示,再通过自定义命令添加函数添加到基础命令列表,添加方式类似于 finsh/msh 命令添加方式,添加函数如下:
  1. AT_CMD_EXPORT(_name_, _args_expr_, _test_, _query_, _setup_, _exec_);
  • name:AT 命令名称;
  • args_expr:AT 命令参数表达式;(无参数为NULL,<> 中为必选参数,[] 中为可选参数)
  • test :AT 测试功能函数名;(无实现为NULL)
  • query:AT 查询功能函数名;(同上)
  • setup:AT 设置功能函数名;(同上)
  • exec :AT 执行功能函数名;(同上)
    如下为 AT 命令注册示例,AT+TEST 命令存在两个参数,第一个参数为必选参数,第二个参数为可选参数,命令实现查询功能和执行功能:
  1. static at_result_t at_test_exec(void)
  2. {
  3. at_server_printfln("AT test commands execute!");
  4.  
  5. return 0;
  6. }
  7. static at_result_t at_test_query(void)
  8. {
  9. at_server_printfln("AT+TEST=1,2");
  10.  
  11. return 0;
  12. }
  13.  
  14. AT_CMD_EXPORT("AT+TEST", =<value1>[,<value2>], NULL, at_test_query, NULL, at_test_exec);

AT Server API 接口

发送数据至客户端(不换行)

  1. void at_server_printf(const char *format, ...);

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

参数 描述
format 自定义输入数据的表达式
输入数据列表,为可变参数
返回 描述

发送数据至客户端(换行)

  1. void at_server_printfln(const char *format, ...);

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

参数 描述
format 自定义输入数据的表达式
输入数据列表,为可变参数
返回 描述

发送命令执行结果至客户端

  1. void at_server_print_result(at_result_t result);

该函数用于 AT Server 通过串口设备发送命令执行结果到对应的 AT Client 串口设备上。AT 组件提供多种固定的命令执行结果类型,自定义命令时可以直接使用函数返回结果;

参数 描述
result 命令执行结果类型
返回 描述

AT 组件中命令执行结果类型以枚举类型给出,如下图所示:

命令执行结果类型 解释
AT_RESULT_OK 命令执行成功
AT_RESULT_FAILE 命令执行失败
AT_RESULT_NULL 命令无返回结果
AT_RESULT_CMD_ERR 输入命令错误
AT_RESULT_CHECK_FAILE 参数表达式匹配错误
AT_RESULT_PARSE_FAILE 参数解析错误

可参考以下代码了解如何使用 at_server_print_result 函数:

  1. static at_result_t at_test_setup(const char *args)
  2. {
  3. if(!args)
  4. {
  5. /* 如果传入的命令之后的参数错误,返回表达式匹配错误结果 */
  6. at_server_print_result(AT_RESULT_CHECK_FAILE);
  7. }
  8.  
  9. /* 正常情况下返回执行成功结果 */
  10. at_server_print_result(AT_RESULT_OK);
  11. return 0;
  12. }
  13. static at_result_t at_test_exec(void)
  14. {
  15. // execute some functions of the AT command.
  16.  
  17. /* 该命令不需要返回结果 */
  18. at_server_print_result(AT_RESULT_NULL);
  19. return 0;
  20. }
  21. AT_CMD_EXPORT("AT+TEST", =<value1>,<value2>, NULL, NULL, at_test_setup, at_test_exec);

解析输入命令参数

  1. int at_req_parse_args(const char *req_args, const char *req_expr, ...);

一个 AT 命令的四种功能函数中,只有设置函数有入参,该入参为去除 AT 命令剩余部分,例如一个命令输入为 "AT+TEST=1,2,3,4",则设置函数的入参为参数字符串 "=1,2,3,4" 部分。

该命令解析函数主要用于 AT 命令的设置函数中,用于解析传入字符串参数,得到对应的多个输入参数,用于执行后面操作,这里的解析语法使用的标准 sscanf 解析语法,后面 AT Client 参数解析函数中会详细介绍。

参数 描述
req_args 请求命令的传入参数字符串
req_expr 自定义参数解析表达式,用于解析上述传入参数数据
输出的解析参数列表,为可变参数
返回 描述
>0 成功,返回匹配参数表达式的可变参数个数
=0 失败,无匹配参数表达式的参数
-1 失败,参数解析错误

可参考以下代码了解如何使用 at_server_print_result 函数:

  1. static at_result_t at_test_setup(const char *args)
  2. {
  3. int value1,value2;
  4.  
  5. /* args 的输入标准格式应为 "=1,2","=%d,%d" 为自定义参数解析表达式,解析得到结果存入value1 和 value2 变量 */
  6. if (at_req_parse_args(args, "=%d,%d", &value1, &value2) > 0)
  7. {
  8. /* 数据解析成功,回显数据到 AT Server 串口设备 */
  9. at_server_printfln("value1 : %d, value2 : %d", value1, value2);
  10.  
  11. /* 数据解析成功,解析参数的个数大于零,返回执行成功 */
  12. at_server_print_result(AT_RESULT_OK);
  13. }
  14. else
  15. {
  16. /* 数据解析失败,解析参数的个数不大于零,返回解析失败结果类型 */
  17. at_server_print_result(AT_RESULT_PARSE_FAILE);
  18. }
  19. return 0;
  20. }
  21. /* 添加 "AT+TEST" 命令到 AT 命令列表,命令参数格式为两个必选参数 <value1> 和 <value2> */
  22. AT_CMD_EXPORT("AT+TEST", =<value1>,<value2>, NULL, NULL, at_test_setup, NULL);

移植相关接口

AT Server 默认已支持多种基础命令(ATE、ATZ 等),其中部分命令的函数实现与硬件或平台相关,需要用户自定义实现。AT 组件源码 src/server.c 文件中给出了移植文件的弱函数定义,用户可在项目中新建移植文件实现如下函数完成移植接口,也可以直接在文件中修改弱函数完成移植接口。

  • 设备重启函数实现

void at_port_reset(void);

该函数完成设备软重启功能,用于 AT Server 中基础命令 AT+RST 的实现。

  • 设备恢复出厂设置函数实现

void at_port_factory_reset(void);

该函数完成设备恢复出厂设置功能,用于 AT Server 中基础命令 ATZ 的实现。

  • 链接脚本中添加命令表(gcc 添加,keil、iar 跳过)
    工程中若使用 gcc 工具链,需在链接脚本中添加 AT 服务器命令表对应的 section ,参考如下链接脚本:
  1. /* Constant data goes into FLASH */
  2. .rodata:
  3. {
  4. ...
  5.  
  6. /* section information for RT-thread AT package */
  7. .=ALIGN(4);
  8. __rtatcmdtab_start=.;
  9. KEEP(*(RtAtCmdTab))
  10. __rtatcmdtab_end=.;
  11. .=ALIGN(4);
  12. }>CODE