ADK:从ADK读取时设备卡住了

时间:2012-12-29 18:43:41

标签: android adk

当我通过USB从电路板向devicersa发送消息时,我遇到了问题。

设备:

  1. Arduino ADK 2011
  2. 三星Galaxy S3,Android 4.1.2
  3. 问题是Android应用程序中的read方法永远不会终止并使线程卡住:

    mFileDescriptor = mUsbManager.openAccessory(accessory);
        if (mFileDescriptor != null) {
            mAccessory  = accessory;
            FileDescriptor fd = mFileDescriptor.getFileDescriptor();
            Log.d(TAG, "openAccessory(): FileDescriptor instanciated. valid " + fd.valid());
            mInputStream = new FileInputStream(fd);
            mOutputStream = new FileOutputStream(fd);
    
            new Thread(null, new Runnable() {
                @Override
                public void run() {
                    int ret = 0;
                    byte[] buffer = new byte[255];
                    while (ret >= 0 && mInputStream != null) {
                        try {
                            // never terminates
                            ret = mInputStream.read(buffer);
                        } catch (IOException e) {
                            Log.e(TAG, "openAccessory(): Could not read inputStream: " + e);
                            e.printStackTrace();
                            break;
                        }
                    } ...
    

    由于我使用特殊的USB库,因此连接正常。当我连接设备时,应用程序会自动打开。但是对于日志,我看到它永远不会通过读取命令。 Arduinio监视器也说:

    Device addressed... Requesting device descriptor.
    found possible device. swithcing to serial mode
    device supports protcol 1 or above
    found android acessory device
    config desc
    interface desc
    interface desc
    2
    4
    Sending message...
    Done
    disconnect
    

    ADK在循环中向设备发送消息(一次):

    sntmsg[0] = COMMAND_TEXT;
    sntmsg[1] = TARGET_DEFAULT;
    sntmsg[2] = 25;
    for (int i = 0; i < 25; i++) {
      sntmsg[3 + i] = hello[i];
    }
    // schreiben (buffer, length)
    Serial.println("Sending message...");
    acc.write(sntmsg, 3 + 25);
    Serial.println("Done");
    done = true;
    delay(250);
    

1 个答案:

答案 0 :(得分:0)

现在我发现问题可能是断开连接。在运行Arduiino代码中的第一个循环之后,它会立即打印到显示器的断开连接。 AndroidAccessory.cpp库中的代码是:

bool AndroidAccessory::isConnected(void)
{
    USB_DEVICE_DESCRIPTOR *devDesc = (USB_DEVICE_DESCRIPTOR *) descBuff;
    byte err;

    max.Task();
    usb.Task();

    if (!connected &&
        usb.getUsbTaskState() >= USB_STATE_CONFIGURING &&
        usb.getUsbTaskState() != USB_STATE_RUNNING) {
        Serial.print("\nDevice addressed... ");
        Serial.print("Requesting device descriptor.\n");

        err = usb.getDevDescr(1, 0, 0x12, (char *) devDesc);
        if (err) {
            Serial.print("\nDevice descriptor cannot be retrieved. Trying again\n");
            return false;
        }

        if (isAccessoryDevice(devDesc)) {
            Serial.print("found android acessory device\n");

            connected = configureAndroid();
        } else {
            Serial.print("found possible device. swithcing to serial mode\n");
            switchDevice(1);
        }
    } else if (usb.getUsbTaskState() == USB_DETACHED_SUBSTATE_WAIT_FOR_DEVICE) {
        if (connected)
            Serial.println("disconnect\n");
        connected = false;
    }

    return connected;
}

因此,在第二个循环中,即使智能手机仍通过USB连接,此方法也会返回false。你知道为什么它认为在第一次循环迭代后它是dosconnected吗?

谢谢, FL