Lua: 为回调函数添加参数

故事很短:在Lua中如何给回调函数传递参数?

故事很长:

我正在使用NodeMCU固件的ESP8266上工作。我打算构建一个Dash按钮,只不过每个节点有多个按钮。我使用GPIO引脚的中断功能来实现这一点。

但是如何将参数传递给回调函数似乎没有很好的文档。在我的情况下,我想知道中断来自哪个引脚。这就是我想到的。它能工作,除了引脚的值,当触发引脚时,它似乎会重置为1的初始化值。

  -- 有一个区域用于保存要查询的所有引脚(在测试中只有一个)

  buttonPins = { 5 }
  direction="up"

  armAllButtons()

  function armAllButtons()
    for i,v in ipairs(buttonPins)
    do
        armButton(v)
    end
  end

  function armButton(buttonPin)
    print("为按钮按压准备引脚 "..buttonPin.."。")

    gpio.mode(buttonPin,gpio.INT,gpio.FLOAT)
    gpio.trig(buttonPin, direction, function (buttonPin) notifyButtonPressed(buttonPin) end)

    print("在 "..buttonPin.." 上等待按钮按压...")
  end

  function notifyButtonPressed(buttonPin)
    print("按压引脚 "..buttonPin.." 的按钮被按下。")

    --重新为中断准备引脚
    armButton(buttonPin)
  end

但是在 notifyButtonPressed() 函数内部,当按下按钮时,buttonPin 的值始终为1,而不是我期望的5。我认为这可能是数字变量的初始化值。

点赞
用户7066323
用户7066323

首先,你的代码根本无法运行... 现在就会抛出以下错误:

input:6: attempt to call a nil value (global 'armAllButtons')

在我重新排列你的代码片段之后:

  buttonPins = { 5 }
  direction="up"

  function armButton(buttonPin)
    print("Arming pin "..buttonPin.." for button presses.")

    gpio.mode(buttonPin,gpio.INT,gpio.FLOAT)
    gpio.trig(buttonPin, direction, function (buttonPin) --notifyButtonPressed(buttonPin) end)

    print("Waiting for button press on "..buttonPin.."...")
  end

  function notifyButtonPressed(buttonPin)
    print("Button at pin "..buttonPin.." pressed.")

    --重新放置中断针脚
    armButton(buttonPin)
  end

  function armAllButtons()
    for i,v in ipairs(buttonPins)
    do
        armButton(v)
    end
  end

armAllButtons()

输出如下:

Arming pin 5 for button presses.
Waiting for button press on 5...

为了让你的回调完美地工作,你必须为每个按钮传递不同的函数,并且不尝试传递参数给这些函数... 试试这个:

  buttonPins = { 5 }
  direction="up"

  function armButton(buttonPin)
    print("Arming pin "..buttonPin.." for button presses.")

    gpio.mode(buttonPin,gpio.INT,gpio.FLOAT)
    gpio.trig(
      buttonPin,
      direction,
      function ()
        notifyButtonPressed(buttonPin)
      end
    ) -- 这应该为每个按钮创建一个函数,并在每个函数中传递不同的参数到 notifyButtonPressed

    print("Waiting for button press on "..buttonPin.."...")
  end

  function notifyButtonPressed(buttonPin)
    print("Button at pin "..buttonPin.." pressed.")

    --重新放置中断针脚
    armButton(buttonPin)
  end

  function armAllButtons()
    for i,v in ipairs(buttonPins)
    do
        armButton(v)
    end
  end

armAllButtons()
2017-01-06 13:20:56