gpt4 book ai didi

c++ - 从数组类属性填充并执行回调

转载 作者:行者123 更新时间:2023-12-02 10:11:10 25 4
gpt4 key购买 nike

我最近开始学习C++ / Arduino,并且正在对我的一些Arduino代码进行抽象化,以使其更易于管理。
我正在尝试构造一个具有2个数组作为其属性的类,一个用于存储表示命令的字符串,第二个用于存储指向这些函数的指针。
下面的代码可以工作(编译),但是当将listenexecute函数上传到设备时,它们似乎均不起作用。我已经搜索了很多东西,但是找不到我哪里出错了。

/* main.ino */

// SETUP
#include "SoftwareSerial.h"
SoftwareSerial bt(btRx, btTx);

#include "CMD.h"
const int cmdMax = 6;
ArriCMD cmd;

// COMMANDS
void cmdStatus()
{
Serial.println("OK");
}

// START
void setup()
{
Serial.begin(9600);
bt.begin(9600);

cmd.add("AH+STAT", cmdStatus);
}

void loop()
{
cmd.listen(bt);
}
/* ArriCMD.h */

#ifndef ArriCMD_h
#define ArriCMD_h

#include "Arduino.h"
#include "SoftwareSerial.h"

class ArriCMD
{
public:
ArriCMD();
void add(String cmd, void (*cb)());
void listen(SoftwareSerial serial);
void execute(String cmd);

private:
int _max = 16;
int _amt = 0;
String _cmds[16];
void (*_cbs[16])();
};
/* ArriCMD.cpp */

#include "Arduino.h"
#include "SoftwareSerial.h"
#include "ArriCMD.h"

ArriCMD::ArriCMD()
{
//
}

void ArriCMD::add(String cmd, void (*cb)())
{
if (_amt < _max) {
_cmds[_amt] = cmd;
_cbs[_amt] = *cb;
}
}

void ArriCMD::listen(SoftwareSerial serial)
{
if (serial.available()) {
String cmd = serial.readString();
Serial.print(cmd);
execute(cmd);
}
}

void ArriCMD::execute(String cmd)
{
for (int i = 0; i < _amt; i++) {
if (cmd == _cmds[i]) {
_cbs[i]();
}
}
}
尽管我从事编程已有十多年了,但是C++和微 Controller 对我来说是全新的,这里的所有帮助将不胜感激。
一旦我对代码质量更加满意后,我确实打算开源这些库以及为它们构建的后续平台。

最佳答案

好像您忘了增加命令计数器_amt

void ArriCMD::add(String cmd, void (*cb)())
{
if (_amt < _max) {
_cmds[_amt] = cmd;
_cbs[_amt] = *cb;
_amt++; // <-- here, don't you need it?
}
}
除此之外,在代码中使用原始数组和原始函数指针是否还有某些特殊原因?我不使用Arduino,所以不确定,但是也许此解决方案比较干净:
class ArriCMD
{
public:
ArriCMD();
void add(String cmd, std::function<void()> cb);
void listen(SoftwareSerial serial);
void execute(String cmd);

private:
std::map<String, std::function<void()> > _cmdMap;
};

关于c++ - 从数组类属性填充并执行回调,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63518728/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com