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

来源:互联网 发布:不用手机注册淘宝账号 编辑:程序博客网 时间:2024/06/03 16:59

  • 前言
  • ATCmd库
    • 介绍
    • 功能
    • 下载
    • 安装
  • ATCmd使用说明
    • 类和方法
      • ATCommand AT指令集
      • CommandItem 指令项
      • CommandParameter 指令参数
    • 实例
      • 示例代码
      • 创建命令项
      • 解析AT指令
      • 返回结果

前言

本文将以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 boardvoid 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 forevervoid 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

原创粉丝点击