android - GpioCallback 如何连续两次注册 "false"?

标签 android kotlin gpio android-things

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

但是,我的日志让我感到奇怪:我怎么会连续获得两个“错误”读数?如果我有一个电灯开关,我不能连续关两次……我需要在中间打开它,对吗? 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

最佳答案

是的,这在按钮、继电器触点和“摆动电线”等嘈杂的输入信号中很常见。触点闭合期间发生的信号弹跳可能会非常迅速地发生,以至于并非每个边沿触发事件都被输入寄存器捕获。

所有 GPIO 系统(不仅仅是 Android Things)都是如此,这也是为什么 signal debounce 的原因之一。这是一种常见的做法。 button driver 中的去抖代码实际上是为处理此类情况而编写的,以确保它们不会生成错误事件。

关于android - GpioCallback 如何连续两次注册 "false"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44322455/

相关文章:

c - 关于从寄存器GPIODATA读取引脚

c++ - visual studio编译wiringPi.h报错

android - 请求应用程序更新许可

java - Service.startForeground 震动设备

c - 导出时未创建 Linux GPIO 值文件

java - Android ListView.notifyDataSetChanged 导致不正确的行

android - 如何将参数传递给android中的对话框?

android - 将 asynctask 值传递给 mainactivity 时出现上下文错误

android - 从移动浏览器获取 URL?

kotlin - 在 Kotlin 中读取和处理 HOCON