我有一个非常简单的 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/