Android到Arduino USB通讯:阅读

时间:2015-01-23 20:39:04

标签: java android serial-port arduino usb

我一直在查看示例,而且我还不清楚如何从我的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 being recognized as keyboard by android显示为HID键盘输入设备的Arduino Leonardo。我只是修改了USBDesc.h以删除" #define HID_ENABLED"。这并没有改变这种情况。与此同时,我还实现了Physicaloid USB库,但事实证明也不成功。我正在调试/转换mik3y的USB-serial-for-android库,但到目前为止还无法用它进行测试。

1 个答案:

答案 0 :(得分:0)

您的Android设备可以用作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.

也有类似的过程