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

问题描述

我最近开始学习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 ++和微控制器对我来说是全新的,这里的所有帮助将不胜感激。

一旦我对代码质量更加满意,我确实打算开源这些库以及它们构建的后续平台。

解决方法

好像您忘了增加命令计数器<script type="text/javascript"> var bookBtn = document.getElementById("bookBtn"); var book = document.getElementById("book"); book.style.bottom = "-100vh"; bookBtn.onclick = function(){ if (book.style.bottom=="-100vh") { book.style.bottom="-100px"; } var closeBtn = document.getElementById("closeBtn"); closeBtn.onclick = function(){ if (book.style.bottom=="-100px"){ book.style.bottom="-100vh"; } } } </script> #book{ width: 100%; height: 100vh; position: fixed; bottom: -1000px; background: #0079e3; transition: 2s; z-index: 2; }

_amt

除此之外,在代码中使用原始数组和原始函数指针是否还有某些特殊原因?我不使用Arduino,所以不确定,但是也许此解决方案比较干净:

void ArriCMD::add(String cmd,void (*cb)())
{
  if (_amt < _max) {
    _cmds[_amt] = cmd;
    _cbs[_amt] = *cb;
    _amt++;  // <-- here,don't you need it?
  }
}

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...