发送大数据包后,Android Open Accessory USB通信失败

时间:2015-12-15 17:36:35

标签: android android-open-accessory

我有一个使用AOA与Linux机器通信的android手机。 Linux机器设置为启动连接,然后等待传入数据并将其回送到手机不变。这适用于手机的小数据包(小于1024字节)。但是,如果我只发送1024个字节,它似乎可以在Android端工作,但计算机永远不会看到数据包,只有任何较小的数据包。如果手机试图发送大于1024的数据包,计算机会收到这些数据包,但Android手机将无法再从计算机接收任何数据包。进一步混淆了这个问题,这在过去确实有效,但回到早期版本的手机上的发送/接收代码似乎没有任何影响。计算机上的代码尚未更改。

Android应用程序在启动时检查USB配件,如果找到一个,它会启动一个监听器和发送器线程。发送方线程在阻塞队列上等待传出数据包,并在收到它们后立即发送它们。侦听器线程不断尝试从输入流中读取,该输出流将阻塞直到数据可用。这是我用来设置和安装的代码。运行线程:

private boolean openUSB(){
    mUSBManager = (UsbManager) getSystemService(Context.USB_SERVICE);
    mAccessory = mUSBManager.getAccessoryList();
    if (mAccessory != null && mAccessory.length > 0) {
        mParcelFileDescriptor = mUSBManager.openAccessory(mAccessory[0]);
        mFileDescriptor = mParcelFileDescriptor.getFileDescriptor();

        mListener = new Thread() {
            public void run() {
                listenerThread();
            }

        };
        mListener.start();

        mSender = new Thread() {
            public void run() {
                senderThread();
            }

        };
        mSender.start();
        displayText("Connected to USB accessory");

        return true;
    } else {
        displayText("No USB accessory detected"); 
        return false;
    }
}

private void listenerThread(){

    byte packet[] = new byte[SDR_PREFIX_SIZE+SDR_HEADER_SIZE+SDR_MAX_PAYLOAD+SDR_CRC_SIZE];
    FileInputStream input = new FileInputStream(mFileDescriptor);
    try {
        ByteArrayOutputStream incoming = new ByteArrayOutputStream();
        displayText("Listener Started");
        while ( mFileDescriptor != null && input != null ) {
            int read = input.read(packet,0,packet.length);

            /* data in packet gets processed */
        }
    } catch ( Exception e) {
        displayText("Listener Exception - "+e.getMessage(),true);
    }
    displayText("Listener Exited");
}

private void senderThread(){

    displayText("sender started");
    FileOutputStream output=new FileOutputStream(mFileDescriptor);

    try {
        byte data[] = mTransmitQueue.take();
        while (data != null) {
            displayText("Sending packet " + packet + ", "+data.length + " bytes");
            output.write(data);

            data = mTransmitQueue.take();
        }

    } catch ( Exception e) {
        displayText("Sender Exception - "+e.getMessage(),true);
    }
}

在过去,我遇到了让侦听器和发送器工作的问题,直到我发现用于创建文件流的一些中间对象被垃圾收集,但仍然需要。我现在将所有这些中间对象存储到成员变量(mUSBManager,mAccessory,mParcelFileDescriptor,mFileDescriptor)以赋予它们持久性。我怀疑这个问题类似,但我未能取得任何进展。我在这个问题上一直没有取得任何成功,并且真的希望其他人能够对导致这种情况的原因有所了解。

1 个答案:

答案 0 :(得分:0)

我找到了解决办法,扩展用于接收数据的缓冲区似乎可以解决问题,即使现有缓冲区对于所有数据包都足够大。将缓冲区从1524增加到2524解决了未接收传入数据包的问题。这是一个kludgy解决方案,但它确实有效。