Arduino命令解析库(Commander)的使用和实现如何高效优化?
摘要:Arduino命令解析库(Commander)的使用和实现 在嵌入式系统中,特别是在Arduino平台上,命令解析是一种常见的通信方式。 本文将介绍一个简单的Arduino命令解析库(Commander),并提供使用示例、头文件和源文件。
Arduino命令解析库(Commander)的使用和实现
在嵌入式系统中,特别是在Arduino平台上,命令解析是一种常见的通信方式。
本文将介绍一个简单的Arduino命令解析库(Commander),并提供使用示例、头文件和源文件。
内容摘自simpleFOC的Commander部分。
使用示例
以下是一个简单的使用示例,演示如何在Arduino中使用Commander库:
#include <Commander.h>
Commander command = Commander('\n', false);
Commander command2 = Commander('\n', false);
// 一级命令
void doL(char *cmd)
{
// L-0.02
// 取出cmd中的带符号浮点数
float value_1 = atof(cmd);
Serial.printf("L: %f\n", value_1);
// 将后续目录进行解析
command2.run(cmd);
};
// 二级命令
void doLA(char *cmd)
{
// LA-0.02
// 取出cmd中的带符号浮点数
float value_1 = atof(cmd);
Serial.printf("LA: %f\n", value_1);
};
void setup()
{
Serial.begin(115200);
// 添加新命令 (命令关键字,回调函数,标签文本)
command.add('L', doL, "getL");
command2.add('A', doLA, "getLA");
delay(100);
}
void loop()
{
delay(2);
command.run(Serial);
}
在这个示例中,我们创建了两个Commander实例:command和command2,分别用于处理一级命令和二级命令。通过定义回调函数 doL 和 doLA,我们可以在收到相应命令时执行自定义的操作。
Commander.h
#ifndef COMMANDS_H
#define COMMANDS_H
#include "Arduino.h"
// commander configuration
#define CMD_SCAN '?' //!< command scaning the network - only for commander
#define CMD_VERBOSE '@' //!< command setting output mode - only for commander
#define CMD_DECIMAL '#' //!< command setting decimal places - only for commander
#define MAX_COMMAND_LENGTH 20
// Commander用于显示用户类型的详细信息
enum VerboseMode : uint8_t
{
nothing = 0x00, // 无显示 - 适合监控
on_request = 0x01, // 仅在用户请求时显示
user_friendly = 0x02 // 向用户显示文本消息
};
// 回调函数指针定义
typedef void (*CommandCallback)(char *); //!< 命令回调函数指针
/**
* 这是一个Commander类,它实现了基于IDvalue(例如"AB5.321" - 命令ID A,子命令ID B,值 5.321)的字符串通信协议。
* - 该类可以与HardwareSerial实例结合使用,它将读写,或者可以用来解析从用户外部获得的字符串。
* - Commander还提供了一个非常简单的命令>回调接口,使用户可以将回调函数附加到某个命令ID,详见函数add()。
*/
class Commander
{
public:
/**
* 默认构造函数接收一个串行接口,它用于输出值。
* 如果使用run()函数,它将使用此串行实例读取串行用户命令。
