0

USB 経由でボードから devicersa にメッセージを送信するときに問題が発生します。

ハードウェア:

  1. Arduino ADK 2011
  2. サムスンギャラクシー S3、アンドロイド 4.1.2

問題は、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 はループ内のデバイスにメッセージを送信します (1 回):

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);
4

1 に答える 1

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;
}

したがって、2 番目のループでは、スマートフォンがまだ USB 経由で接続されている場合でも、このメソッドは false を返します。最初のループ反復の後で dosconnected であると考える理由を知っていますか?

ありがとう、フロリダ

于 2012-12-31T16:07:38.437 に答える