0

我正在使用 esp8266 制作一个简单的自制物联网解决方案,使用内置库用于 Web 服务器路由。这些库函数不喜欢使用带参数的函数,所以我的解决方案是使用 lambdas 并捕获我需要的变量。问题是,当尝试对来自两个不同 lambda 的对象的同一实例进行操作时,当使用 pinPower 设置器方法更新存储引脚功率的 int (1 或 0,是的,我知道 bool 会更好)时一个 lambda 不会出现在另一个中。

我认为这与 lambdas 按值捕获变量并创建我的类的新实例有关;我曾尝试捕获 outputPinArray[i] 作为参考,但这只是意味着 getter 函数未能获得正确的值,因此未能执行切换值(类在内部使用 getter)。使用静态变量和 getter 函数有效,但我希望能够使用该类的多个实例,因此不想要这样的共享变量。我已经看到各种帖子似乎指向使用 extern 关键字进行捕获,但我没有找到太多在 lambdas 中使用它的文档,也无法弄清楚如何正确使用它。

这是我正在使用的代码:

for(int i = 0; i < 1; i++) {
    server.on(path, HTTP_POST, [outputPinArray , argToCheck, i]() mutable {
        // Sets pinNumber variable and turns on or off the arduino pin using outputPinArray[i].setPinPower or .togglePinPower    
    });


    server.on(path, HTTP_GET, [outputPinArray,i](){
        // Send integer value using outputPinArray[i].getPinPower()
    });
}

outputPin 类代码:

int OutputPin::getPinPower(){
    return pinPower;
}

void OutputPin::setPinPower(int value){
    if(value == HIGH || value == LOW){
        pinPower = value;
        digitalWrite(getPinNum(), pinPower);
}

任何帮助表示赞赏,谢谢!

4

2 回答 2

1

如果我正确理解您的问题,您需要做的就是

server.on(path, HTTP_POST, [&outputPinArray , argToCheck, i]()  {
于 2017-02-17T08:47:11.437 回答
0

Fail on my part, the array went out of scope while the routes were the esp8266webserver object was declared globally. Solved with help with @obamator

于 2017-02-17T09:22:30.703 回答