首页 文章

拔出和重新插入后,USB OTG设备无法工作

提问于
浏览
1

我正在尝试与Android上的USB OTG设备连接 . 由于代码有点冗长,我将概述基础知识:

  • 在清单中声明了 USB_DEVICE_ATTACHED (已过滤我感兴趣的设备ID)的Intent过滤器活动 .

  • 当使用该特定意图启动活动时,它将启动服务并将USB设备作为参数传递 .

  • 当服务启动时,它为 USB_DEVICE_DETACHED 注册广播接收器,然后连接到设备并开始与它进行交互(当前生成一些日志输出) .

  • 当收到USB断开广播时 and 设备是当前正在使用的设备,在USB设备连接上调用 close() ,服务停止 .

该设备是Si4701 USB FM调谐器,它本身就是一个USB HID设备 .

当我第一次插入设备时,我看到我的服务连接到它,可以更改 Channels 并接收RDS数据 .

但是,当我拔下它并将其重新插入时,我看到服务再次连接到它(并且显然已成功读取设备寄存器),但它无法改变频率,我从未看到任何RDS数据 .

如果我强制应用程序在拔出插头和重新插入设备之间停止,则设备会在插入电源后正常工作 .

这表明某些清理无法进行,或者某些资源未正确释放 . 然而:

  • 我没有在连接之间保留与设备相关的任何数据结构 . 与USB连接相关的所有内容都是在检测到设备时创建的类实例中,并且这些类的所有静态成员都是最终成员 .

  • 重新插入设备后有些工作正常,例如读取设备类型和固件版本的寄存器(通过获取USB HID功能报告来工作) . 初始化还设置了几个寄存器(通过发送USB功能报告),它不会返回错误 - 但更改频率(也涉及设置寄存器)不起作用 .

  • 拔出和重新插入之间的间隔〜15分钟没有效果(设备不起作用) . 另一方面,如果我拔掉设备,杀掉服务并重新插入,它会立即工作 - 所以问题肯定在Android端,而不是在设备端 .

拔出/重新插拔后,我需要做些什么才能使USB设备正常工作?

1 回答

  • 0

    我仍然不完全了解这里发生了什么,但现在似乎工作 .

    我应该提一下,该应用程序是多线程的,并且从多个线程调用Si470x包装器类 .

    由于这导致竞争条件(当另一个线程刚刚关闭它时,一个线程访问设备),我正确地将所有方法声明为 synchronized ,以便没有两个线程可以同时访问调谐器类的方法 . 将设备插入电源插头,拔下电源插头,插入电源插头,然后观察它会改变频率并按照预期的方式吐出RDS数据 .

    Suspicion:

    UsbDeviceConnection#close() 可能不是线程安全的 .

    Conclusions:

    • 完成设备后始终调用 UsbDeviceConnection#close() (包括分离设备时) .

    • 如果您的应用是多线程的,请确保所有访问USB连接(直接或间接)的内容都已正确同步 .

相关问题