【问题标题】:Android to Arduino USB Communication: ReadingAndroid 到 Arduino USB 通信:阅读
【发布时间】:2015-01-23 20:39:04
【问题描述】:

我一直在查看示例,但我仍然不清楚如何从我的 Android 应用程序中的 USB 端口实际读取数据。我希望它是事件/意图驱动的,但我对如何做到这一点非常迷茫。我有一个 BroadcastReceiver,但我不确定我需要寻找什么 Intent.action 才能捕获传入的数据。感谢任何见解!

编辑:澄清一下我的 Android 设备是作为 USB 主机运行的 Nexus 9,我希望与 Arduino Leonardo 进行通信。

Edit2:此时我有一个 Arduino 草图正在运行,每 2 秒通过串行发送一条消息。我有一个按钮,根据我的理解,它应该在按下时读取缓冲区,但实际上并没有做任何事情。

    TextView displayMessages = (TextView)findViewById(R.id.textView);

    try
    {
        byte[] msgBytes = new byte[1000];
        connection.bulkTransfer(input, msgBytes, msgBytes.length, TIMEOUT);

        String msgString = new String(msgBytes, "UTF-8");// msgBytes.toString();
        displayMessages.setText(msgString);
    }
    catch (Exception e)
    {
        displayMessages.setText(e.getMessage());
    }

结果只是 textView 是空白的。如果我不进行转换并将 byte[].toString() 放入其中,我会得到每次按下都会改变的十六进制值,但我不确定如何解释。

编辑 3:随着时间的流逝,还有更多信息,我已禁用 Arduino Leonardo,按照Arduino being recognized as keyboard by android 显示为 HID 键盘输入设备。我只是修改了 USBDesc.h 以删除“#define HID_ENABLED”。这并没有改变情况。与此同时,我还实现了 Physicaloid USB 库,但也证明是不成功的。我正在调试/转换 mik3y 的 USB-serial-for-android 库,但迄今为止无法对其进行测试。

【问题讨论】:

    标签: java android serial-port arduino usb


    【解决方案1】:

    您的安卓设备可以用作usb host or accessory。 因此,根据您是否将手机用作 USB 主机,您可以在清单中使用以下意图和权限。

    <uses-feature android:name="android.hardware.usb.host" />
    <activity ... usb host...>
            <intent-filter>
                <action android:name="android.hardware.usb.action.USB_DEVICE_ATTACHED" />
            </intent-filter>
                <meta-data
                android:resource="@xml/device_filter"
                android:name="android.hardware.usb.action.USB_DEVICE_ATTACHED" />
    

    带有提供设备详细信息的 xml 资源文件。

    <?xml version="1.0" encoding="utf-8"?>
    <resources>
    //details of a device I own
    <usb-device vendor-id="22b8" product-id="2e76" class="ff" subclass="ff" protocol="00" />
    </resources>
    

    然后设置广播接收器并按照in the API的步骤操作。

        private final BroadcastReceiver mUsbReceiver = new BroadcastReceiver() {
    
        public void onReceive(Context context, Intent intent) {
    
            String action = intent.getAction();
            if (ACTION_USB_PERMISSION.equals(action)) {
                synchronized (this) {
                    UsbDevice device =
                            (UsbDevice) intent.getParcelableExtra(UsbManager.EXTRA_DEVICE);
    
                    if (intent.getBooleanExtra(UsbManager.EXTRA_PERMISSION_GRANTED, false)) {
                        if (device != null) {
                            //call method to set up device communication
                        }
                    } else {
                    }
                }
            }
        }
    };
    

    您需要注册您的接收器。

        mUsbManager = (UsbManager) getSystemService(Context.USB_SERVICE);
    
        mPermissionIntent =
                PendingIntent.getBroadcast(this, 0, new Intent(ACTION_USB_PERMISSION), 0);
        IntentFilter filter = new IntentFilter(ACTION_USB_PERMISSION);
        registerReceiver(mUsbReceiver, filter);
    

    然后创建你的函数来读取和写入数据。

    private Byte[] bytes
    private static int TIMEOUT = 0;
    private boolean forceClaim = true;
    
    ...
    
    UsbInterface intf = device.getInterface(0);
    UsbEndpoint endpoint = intf.getEndpoint(0);
    UsbDeviceConnection connection = mUsbManager.openDevice(device); 
    connection.claimInterface(intf, forceClaim);
    connection.bulkTransfer(endpoint, bytes, bytes.length, TIMEOUT); //do in another thread
    

    您需要修改此代码以将数据带到您想要的位置。 This link (android.serverbox) 对处理传输线程进行了很好的讨论。

    此代码已从 android.com 文档中获取并部分修改。

    同样,设置您的设备的过程与a usb accessory.类似

    【讨论】:

    • 是的,我以前看过这段代码,但我仍然不明白其中的哪一部分与读取传入数据有关。据我了解,它只是设置设备通信权限,而不是实际从 USB 读取任何内容。
    • 好的,我已经完成了所有这些设置,我可以将数据发送到我的设备并被接收。已经阅读了您在 Android 文档中发布的所有内容,但仍不清楚这就是我来这里的原因。从文档的样子来看,我无法进行基于事件/意图的读取,而且我实际上必须不断地从我的 USB 端口异步读取,这感觉像是一个糟糕的解决方案。必须有更好的方法来做到这一点,这就是我想知道的。
    • 从串口读取时我也没有看到新链接。我是否希望简单地创建一个从端口读取的持续运行的线程?我很难接受没有事件驱动的方式来做到这一点。
    猜你喜欢
    • 2011-06-17
    • 1970-01-01
    • 1970-01-01
    • 2015-06-24
    • 2017-06-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-08
    相关资源
    最近更新 更多