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
相关产品推荐
相关产品推荐

