ESP8266 AT指令集开发实例(WeMos D1开发板)

前言

本文将以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指令

使用ATCommandparse()方法解析字符串类型的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

猜你喜欢

转载自blog.csdn.net/lgj123xj/article/details/78767842