2017-06-02 116 views
1

我有一个非常简单的设置android-things设置,其中GPIO(输出)产生非常短的(10u)脉冲,并且我试图通过另一个GPIO(输入)读取该脉冲。GpioCallback如何连续两次注册“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 
+0

我想重现您的问题。你使用的是什么gpio输出? – Blundell

+0

我正在听第20针,我从VCC上取下了一根电线,并轻轻地将它放在输入引脚端口并“摆动”了很多。非常科学,我知道。 :) –

回答

2

是的,这是一个像按钮开关,继电器触点,而“波浪线”噪声输入信号相当普遍。触点闭合期间发生的信号反弹可能会非常迅速地发生,因此不是每个边沿触发事件都会被输入寄存器捕获。

所有GPIO系统(不仅仅是Android的东西)都是如此,为什么signal debounce是这样一种常见做法。 button driver中的去抖处理代码实际上是为了处理这种情况而编写的,以确保它们不会产生虚假事件。