Gpio回调如何连续两次注册"false"?



我有一个非常简单的设置android-things设置,其中gpio(输出(生成非常短的(10U(脉冲,我正在尝试通过另一个gpio(输入(读取该脉冲。

但是,我的日志正在弄清楚我:我如何连续获得两个" false"读数?如果我有一个灯开关,我无法连续将其关闭两次...我需要在中间打开它,对吗?Gpiocallback可以放弃事件吗?我的时间太短了吗?电压之间可以有一个软坡道,而这些坡道永远都不算作"边缘"?

val gpioIn = PeripheralManagerService().openGpio(gpioPinName)
gpioIn.setEdgeTriggerType(Gpio.EDGE_NONE) // reset for Android Things bug
gpioIn.setDirection(Gpio.DIRECTION_IN)
gpioIn.setActiveType(Gpio.ACTIVE_HIGH)
gpioIn.setEdgeTriggerType(Gpio.EDGE_BOTH) // I should get all changes, right?
gpioIn.registerGpioCallback(object : GpioCallback() {
    override fun onGpioEdge(gpio: Gpio?): Boolean {
        netLog((gpio?.value  ?: "null").toString())
        return true
    }
    override fun onGpioError(gpio: Gpio?, error: Int) {
        netLog("GPIO $gpio Error event $error")
    }
})

导致

06-02 06:33:37.052 I/NetGpioListener: NET GPIO LISTENER: 118730013 true
06-02 06:33:37.091 I/NetGpioListener: NET GPIO LISTENER: 118769152 false
06-02 06:33:37.094 I/NetGpioListener: NET GPIO LISTENER: 118772102 false

是的,这在嘈杂的输入信号(如PushButtons,继电器触点和" Wiggly Wires"(中相当普遍。接触闭合期间发生的信号反弹可能非常迅速,因此并非每个边缘触发事件都由输入寄存器捕获。

对所有GPIO系统(不仅是Android事物(都是如此,因此信号召唤是一种常见的做法的一个原因。实际上写了按钮驱动程序中的访问代码来处理这样的案例,以确保它们不会产生错误事件。

最新更新