GpioCallback如何注册"false"?连续两次? [英] How can a GpioCallback register "false" twice in a row?

查看:87
本文介绍了GpioCallback如何注册"false"?连续两次?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

I have a very simple setup android-things setup where a GPIO (output) generates very short (10u) pulse, and I'm trying to read that pulse through another GPIO (input).

但是,我的日志让我感到困惑:如何连续获得两个假"读数?如果我有电灯开关,则不能连续关闭两次...我需要在两次开关之间将其打开,对吗?GpioCallback可以丢弃事件吗?我的时间太短了吗?电压之间是否可以有一个不算作边沿"的软斜坡?

However, my logs are weirding me out: how could I get two "false" readings in a row? If I have a light switch, I can't turn it off twice in a row... I need to turn it on in between, right? Can the GpioCallback drop events? Is my time too short? Can there be a soft ramp between voltages that doesn't ever count as an "edge"?

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

推荐答案

是的,这对于带有噪声的输入信号(如按钮,继电器触点和绕线")相当普遍.触点闭合期间发生的信号反弹可能很快发生,因此并非每个边缘触发事件都被输入寄存器捕获.

Yes, this is fairly common with noisy input signals like pushbuttons, relay contacts, and "wiggly wires". The signal bounce that occurs during contact closure can happen very rapidly such that not every edge trigger event is captured by the input registers.

所有GPIO系统(不仅是Android Things)都是如此,也是按钮驱动程序中的去抖动代码实际上是为处理类似以下情况而编写的这是为了确保它们不会产生虚假事件.

This is true of all GPIO systems (not just Android Things), and one reason why signal debounce is such a common practice. The debounce code in the button driver was actually written to handle cases like this to ensure they didn't generate false events.

这篇关于GpioCallback如何注册"false"?连续两次?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆