本文将以WeMos D1开发板
为例,赋予开发板解析AT指令的功能。
本实例中所有代码在WeMos开发板中均能正常执行,理论上兼容NodeMCU及其他基于ESP8266的开发板。
ATCmd是物联网硬件设备库TyphaSeed中用以处理AT指令的C++库,旨在帮助开发者轻松实现开发板对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
void addCommandItem(CommandItem& item);
void addCommandItems(CommandItem items[], int count);
\r
“作为结束符)String parse(String strCmd);
typedef std::function
CommandFunc;
CommandItem(String strName, CommandFunc func);
CommandItem(const char * cpName, CommandFunc func);
String execute(CommandParameter param);
String& getName();
CommandParameter(String& strParam);
uint8_t count();
String get(uint8_t index);
接下来将以ATCmd库中附带的示例代码AT指令控制板载LED (AT_LED.ino)
进行演示和讲解(基于WeMos D1开发板)。
#include
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 "返回结果(字符串)";
});
使用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