前言
本文将以WeMos D1开发板
为例,赋予开发板解析AT指令的功能。
本实例中所有代码在WeMos开发板中均能正常执行,理论上兼容NodeMCU及其他基于ESP8266的开发板。
ATCmd库
介绍
ATCmd是物联网硬件设备库TyphaSeed中用以处理AT指令的C++库,旨在帮助开发者轻松实现开发板对AT指令的定义与解析执行。
功能
- 创建AT指令集
- 动态向AT指令集中添加指令项
- 灵活的为指令项添加回调函数
- 自动匹配指令
- 便捷获取附带参数
下载
下载Libraries - ATCmd v0.9.0
:
https://github.com/landriesnidis/TyphaSeed/archive/0.9.0.zip
查看最新版本(名称为: Libraries - ATCmd
的最新版本):
https://github.com/landriesnidis/TyphaSeed/releases
安装
下载zip,将文件解压至到Arduino指定的目录中,这个指定的目录在分不同的平台而定:
- 在Windows平台一般是”My Documents\Arduino\libraries”
- 在mac平台一般是”Documents/Arduino/libraries”
- 在Linux平台一般是”sketchbook”目录下的libraries
ATCmd使用说明
类和方法
ATCommand AT指令集
- 添加指令项
void addCommandItem(CommandItem& item);
- 添加指令项数组
void addCommandItems(CommandItem items[], int count);
- 解析AT指令(返回值中以”
\r
“作为结束符)
String parse(String strCmd);
CommandItem 指令项
- 回调函数类型
typedef std::function
<String(CommandParameter)>
CommandFunc;
- 构造函数
CommandItem(String strName, CommandFunc func);
CommandItem(const char * cpName, CommandFunc func);
- 执行回调函数
String execute(CommandParameter param);
- 获取命令名称
String& getName();
CommandParameter 指令参数
- 构造函数
CommandParameter(String& strParam);
- 获取参数个数
uint8_t count();
- 获取第index个参数项
String get(uint8_t index);
实例
接下来将以ATCmd库中附带的示例代码AT指令控制板载LED (AT_LED.ino)
进行演示和讲解(基于WeMos D1开发板)。
示例代码
#include <ATCommand.h>
ATCommand atc;
//初始化AT指令集
void initATCommands(){
//定义一个测试指令,示例:AT+TEST=1,2,3...
CommandItem cmdTest("TEST", [](CommandParameter param)->String{
Serial.printf("parameter count : %d\n", param.count());
for (int i = 0; i < param.count(); i++){
Serial.printf("arg%d=%s\n", i, param.get(i).c_str());
}
return "OK";
});
//定义一个控制板载LED的指令,示例:AT+LED=0 或 AT+LED=1
CommandItem cmdLED("LED", [](CommandParameter param)->String{
if (param.count() != 1){
return "ERROR";
}
//获取第0位参数
String arg0 = param.get(0);
if (arg0.equals("0")){
digitalWrite(LED_BUILTIN, LOW); // turn the LED off by making the voltage LOW
}
else if (arg0.equals("1")){
digitalWrite(LED_BUILTIN, HIGH); // turn the LED on (HIGH is the voltage level)
}
else{
return "ERROR";
}
return "OK";
});
atc.addCommandItem(cmdTest);
atc.addCommandItem(cmdLED);
}
//接收来自串口的数据
void receiveDataFromSerial(){
static String temp_s = "";
char temp_c;
if (!Serial)
return;
while (Serial.available() > 0)
{
temp_c = char(Serial.read()); //单字节读取串口数据
if (temp_c == '\r') { //判断是否为终止符
Serial.println(atc.parse(temp_s).c_str());
temp_s = "";
}
else {
temp_s += temp_c;
}
delay(2);
}
}
// the setup function runs once when you press reset or power the board
void setup() {
//打开串口
Serial.begin(115200);
Serial.println("\nStart");
// initialize digital pin LED_BUILTIN as an output.
pinMode(LED_BUILTIN, OUTPUT);
//初始化AT指令集
initATCommands();
}
// the loop function runs over and over again forever
void loop() {
//接收串口数据
receiveDataFromSerial();
delay(100);
}
创建命令项
使用CommandItem 创建命令项,在构造函数中为其设定关键字和回调函数:
CommandItem 命令项变量名称("命令关键字", [](CommandParameter param)->String{
//需要执行的执行代码
//……
return "返回结果(字符串)";
});
解析AT指令
使用ATCommand的parse()方法解析字符串类型的AT指令并获得字符串类型的返回值:
String result = ATCommand对象.parse("AT指令");
返回结果
输入:AT+LED=1
输出:+LED:OK
输入:AT+LED=0
输出:+LED:OK
输入:AT+TEST
输出:
parameter count : 0
+TEST:OK
输入:AT+TEST=1,2,3
输出:
parameter count : 3
arg0=1
arg1=2
arg2=3
+TEST:OK