极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 4757|回复: 1

新手求帮忙

[复制链接]
发表于 2013-4-18 11:00:58 | 显示全部楼层 |阅读模式
本帖最后由 orphenleoli 于 2013-4-19 16:31 编辑

大家好,刚接触到Arduion,想试着用自己的手机控制LED13 灯,可是android 往外发命令总是出错:
package com.tkjelectronics.arduinoblinkled;

import java.io.FileDescriptor;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;

import android.app.Activity;
import android.app.PendingIntent;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.Bundle;
import android.os.ParcelFileDescriptor;
import android.util.Log;
import android.view.View;
import android.widget.ToggleButton;

import com.android.future.usb.UsbAccessory;
import com.android.future.usb.UsbManager;

public class ArduinoBlinkLEDActivity extends Activity {

        // TAG is used to debug in Android logcat console
        private static final String TAG = "ArduinoAccessory";

        private static final String ACTION_USB_PERMISSION = "com.google.android.DemoKit.action.USB_PERMISSION";

        private UsbManager mUsbManager;
        private PendingIntent mPermissionIntent;
        private boolean mPermissionRequestPending;
        private ToggleButton buttonLED;
       
        UsbAccessory mAccessory;
        ParcelFileDescriptor mFileDescriptor;
        FileInputStream mInputStream;
        FileOutputStream mOutputStream;

        private final BroadcastReceiver mUsbReceiver = new BroadcastReceiver() {
                @Override
                public void onReceive(Context context, Intent intent) {
                        String action = intent.getAction();
                        if (ACTION_USB_PERMISSION.equals(action)) {
                                synchronized (this) {
                                        UsbAccessory accessory = UsbManager.getAccessory(intent);
                                        if (intent.getBooleanExtra(
                                                        UsbManager.EXTRA_PERMISSION_GRANTED, false)) {
                                                openAccessory(accessory);
                                        } else {
                                                Log.d(TAG, "permission denied for accessory "
                                                                + accessory);
                                        }
                                        mPermissionRequestPending = false;
                                }
                        } else if (UsbManager.ACTION_USB_ACCESSORY_DETACHED.equals(action)) {
                                UsbAccessory accessory = UsbManager.getAccessory(intent);
                                if (accessory != null && accessory.equals(mAccessory)) {
                                        closeAccessory();
                                }
                        }
                }
        };

        @Override
        public void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);

                mUsbManager = UsbManager.getInstance(this);
                mPermissionIntent = PendingIntent.getBroadcast(this, 0, new Intent(ACTION_USB_PERMISSION), 0);
                IntentFilter filter = new IntentFilter(ACTION_USB_PERMISSION);
                filter.addAction(UsbManager.ACTION_USB_ACCESSORY_DETACHED);
                registerReceiver(mUsbReceiver, filter);

                if (getLastNonConfigurationInstance() != null) {
                        mAccessory = (UsbAccessory) getLastNonConfigurationInstance();
                        openAccessory(mAccessory);
                }

                setContentView(R.layout.main);
                buttonLED = (ToggleButton) findViewById(R.id.toggleButtonLED);

        }

        @Override
        public Object onRetainNonConfigurationInstance() {
                if (mAccessory != null) {
                        return mAccessory;
                } else {
                        return super.onRetainNonConfigurationInstance();
                }
        }

        @Override
        public void onResume() {
                super.onResume();

                if (mInputStream != null && mOutputStream != null) {
                        return;
                }

                UsbAccessory[] accessories = mUsbManager.getAccessoryList();
                UsbAccessory accessory = (accessories == null ? null : accessories[0]);
                if (accessory != null) {
                        if (mUsbManager.hasPermission(accessory)) {
                                openAccessory(accessory);
                        } else {
                                synchronized (mUsbReceiver) {
                                        if (!mPermissionRequestPending) {
                                                mUsbManager.requestPermission(accessory,mPermissionIntent);
                                                mPermissionRequestPending = true;
                                        }
                                }
                        }
                } else {
                        Log.d(TAG, "mAccessory is null");
                }
        }

        @Override
        public void onPause() {
                super.onPause();
                closeAccessory();
        }

        @Override
        public void onDestroy() {
                unregisterReceiver(mUsbReceiver);
                super.onDestroy();
        }

        private void openAccessory(UsbAccessory accessory) {
                mFileDescriptor = mUsbManager.openAccessory(accessory);
                if (mFileDescriptor != null) {
                        mAccessory = accessory;
                        FileDescriptor fd = mFileDescriptor.getFileDescriptor();
                        mInputStream = new FileInputStream(fd);
                        mOutputStream = new FileOutputStream(fd);
                        Log.d(TAG, "accessory opened");
                } else {
                        Log.d(TAG, "accessory open fail");
                }
        }

        private void closeAccessory() {
                try {
                        if (mFileDescriptor != null) {
                                mFileDescriptor.close();
                        }
                } catch (IOException e) {
                } finally {
                        mFileDescriptor = null;
                        mAccessory = null;
                }
        }

        public void blinkLED(View v){

                byte[] buffer = new byte[1];

                if(buttonLED.isChecked())
                        buffer[0]=(byte)1; // button says on, light is on
                else
                        buffer[0]=(byte)0; // button says off, light is off

                if (mOutputStream != null) {
                        try {
                                mOutputStream.write(buffer);
                        } catch (IOException e) {
                                Log.e(TAG, "write failed", e);
                        }
                }
        }

}

这里的IOException的错误是:
java.io.IOException: No such device

打印出来的错误信息:
04-18 10:47:15.642: E/ArduinoAccessory(4523): write failed
04-18 10:47:15.642: E/ArduinoAccessory(4523): java.io.IOException
04-18 10:47:15.642: E/ArduinoAccessory(4523):         at java.io.FileOutputStream.openCheck(FileOutputStream.java:323)
04-18 10:47:15.642: E/ArduinoAccessory(4523):         at java.io.FileOutputStream.write(FileOutputStream.java:299)
04-18 10:47:15.642: E/ArduinoAccessory(4523):         at java.io.FileOutputStream.write(FileOutputStream.java:256)
04-18 10:47:15.642: E/ArduinoAccessory(4523):         at com.tkjelectronics.arduinoblinkled.ArduinoBlinkLEDActivity.blinkLED(ArduinoBlinkLEDActivity.java:168)
04-18 10:47:15.642: E/ArduinoAccessory(4523):         at java.lang.reflect.Method.invokeNative(Native Method)
04-18 10:47:15.642: E/ArduinoAccessory(4523):         at java.lang.reflect.Method.invoke(Method.java:507)
04-18 10:47:15.642: E/ArduinoAccessory(4523):         at android.view.View$1.onClick(View.java:2186)
04-18 10:47:15.642: E/ArduinoAccessory(4523):         at android.view.View.performClick(View.java:2532)
04-18 10:47:15.642: E/ArduinoAccessory(4523):         at android.widget.CompoundButton.performClick(CompoundButton.java:99)
04-18 10:47:15.642: E/ArduinoAccessory(4523):         at android.view.View$PerformClick.run(View.java:9308)
04-18 10:47:15.642: E/ArduinoAccessory(4523):         at android.os.Handler.handleCallback(Handler.java:587)
04-18 10:47:15.642: E/ArduinoAccessory(4523):         at android.os.Handler.dispatchMessage(Handler.java:92)
04-18 10:47:15.642: E/ArduinoAccessory(4523):         at android.os.Looper.loop(Looper.java:150)
04-18 10:47:15.642: E/ArduinoAccessory(4523):         at android.app.ActivityThread.main(ActivityThread.java:4293)
04-18 10:47:15.642: E/ArduinoAccessory(4523):         at java.lang.reflect.Method.invokeNative(Native Method)
04-18 10:47:15.642: E/ArduinoAccessory(4523):         at java.lang.reflect.Method.invoke(Method.java:507)
04-18 10:47:15.642: E/ArduinoAccessory(4523):         at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:849)
04-18 10:47:15.642: E/ArduinoAccessory(4523):         at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:607)
04-18 10:47:15.642: E/ArduinoAccessory(4523):         at dalvik.system.NativeStart.main(Native Method)

请问是什么问题啊?~
回复

使用道具 举报

 楼主| 发表于 2013-4-19 16:33:21 | 显示全部楼层
呵呵,果然太菜的问题没有人理。自己弄好了,还要请大家以后多多帮忙,谢谢
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|联系我们|极客工坊

GMT+8, 2026-6-5 16:56 , Processed in 0.036187 second(s), 18 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表