You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

MicroPython类中回调函数触发TypeError的问题求助

解决方法

错误原因

MicroPython中Pin.irq()的回调函数会在触发时自动将触发中断的Pin对象作为参数传递给handler;而类的实例方法默认第一个参数是self(代表当前类实例),所以当你把self._rotary_switch_callback作为handler时,实际调用时会传入两个参数:self + 触发中断的Pin对象,但你定义的方法只接受self一个参数,因此触发TypeError。

修正后的代码

只需要给回调方法添加一个参数来接收Pin对象即可:

from rotary_encoder.rotary_irq_esp import RotaryIRQ
from machine import Pin


class RotaryEncoder(RotaryIRQ):
    # rotary options
    RANGE_MODE = const(1) # 1->UNBOUNDED, 2->WRAP, 3->BOUNDED
    PIN_CLK = const(7)
    PIN_DT = const(8)
    PULL_UP = True

    # switch options
    PIN_SWITCH = const(6)
    PULL_UP_SWITCH = True
    
    def __init__(self, pin_num_clk=PIN_CLK, pin_num_dt=PIN_DT, min_val=0, max_val=10, incr=1,range_mode=RANGE_MODE, pull_up=PULL_UP,pin_switch=PIN_SWITCH,pull_up_switch=PULL_UP_SWITCH):
        super().__init__(pin_num_clk, pin_num_dt, min_val, max_val, incr, range_mode, pull_up)
        # add switch
        if pull_up_switch:
            self.switch = Pin(pin_switch,Pin.IN, Pin.PULL_UP)
            self.switch.irq(trigger=Pin.IRQ_FALLING, handler=self._rotary_switch_callback)
        else:
            self.switch = Pin(pin_switch,Pin.IN, Pin.PULL_DOWN)
            self.switch.irq(trigger=Pin.IRQ_RISING, handler=self._rotary_switch_callback)

    def _rotary_switch_callback(self, pin):
        # 可通过pin参数判断触发中断的引脚(多中断源场景有用)
        # 这里添加你的业务逻辑
        pass

补充说明

  • 非类环境下的回调函数只需要一个参数,因为没有self自动传递的问题,函数直接接收Pin对象作为唯一参数
  • 类的实例方法必须保留self参数,同时加上中断回调传递的Pin参数,才能匹配调用时的参数数量
  • 即使不需要使用Pin对象,也必须保留该参数,否则会再次触发参数不匹配错误

内容的提问来源于stack exchange,提问作者Daniel

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.21 15:22:03