Передача данных с USB (плодовитый) на устройство Android

Я нашел вопрос для чтения данных USB для устройств FTDI. Перенос данных USB Я использовал этот код для плодовитого устройства, и usb можно обнаружить и т.д., За исключением того, что conn.bulkTransfer() дает -1.

    private class UsbRunnable implements Runnable {
    private final UsbDevice mDevice;

    UsbRunnable(UsbDevice dev) {
        mDevice = dev;
    }


    public void run() {//here the main USB functionality is implemented
        UsbDeviceConnection conn = mUsbManager.openDevice(mDevice);
        if (!conn.claimInterface(mDevice.getInterface(1), true)) {
            l("in run(), no connection");
            return;
        }
        l("in run(), connection");



         conn.controlTransfer(0x40, 0, 0, 0, null, 0, 0);// reset
         // mConnection.controlTransfer(0×40,
         // 0, 1, 0, null, 0,
         // 0);//clear Rx
         conn.controlTransfer(0x40, 0, 2, 0, null, 0, 0);// clear Tx
         conn.controlTransfer(0x40, 0x02, 0x0000, 0, null, 0, 0);// flow
                 // control
                 // none
         conn.controlTransfer(0x40, 0x03,  0xC04E, 0, null, 0, 0);// baudrate
                 // 38400
         conn.controlTransfer(0x40, 0x04, 0x0008, 0, null, 0, 0);// data bit
                 // 8, parity
                 // none,
                 // stop bit
                 // 1, tx off   




        UsbEndpoint epIN = null;
        UsbEndpoint epOUT = null;

        byte counter=0;
    //conn.bulkTransfer(epOUT, new byte[]{msData}, 1, 0);

        UsbInterface usbIf = mDevice.getInterface(0);
        for (int i = 0; i < usbIf.getEndpointCount(); i++) {
            l("EP: "
                    + String.format("0x%02X", usbIf.getEndpoint(i)
                            .getAddress()));
            l("Type:"+usbIf.getEndpoint(i).getType());
            if (usbIf.getEndpoint(i).getType() == UsbConstants.USB_ENDPOINT_XFER_INT) {
                l("Bulk Endpoint");
                l("direction: "+usbIf.getEndpoint(i).getDirection());
                if (usbIf.getEndpoint(i).getDirection() == UsbConstants.USB_DIR_IN)
                    epIN = usbIf.getEndpoint(i);

            }
            else l("no bulk");
            l("epIN: "+epIN.toString());
        }

        for (;;) {// this is the main loop for transferring
            try {
                Thread.sleep(100);
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }

            // This is where it is meant to receive
            byte[] buffer = new byte[38400];

            StringBuilder str = new StringBuilder();

            l("bulk transfer thing: " + conn.bulkTransfer(epIN, buffer, 38400, 1000));

            if (conn.bulkTransfer(epIN, buffer, 38400, 1000) > 0 ) {
                l("bulk transfer is success");
                for (int i = 2; i < 64; i++) {
                    if (buffer[i] != 0) {
                        str.append((char) buffer[i]);
                    } else {
                        l(str);
                        break;
                    }
                }

            }
            // this shows the complete string
            l(str);


            if (mStop) {
                mConnectionHandler.onUsbStopped();
                return;
            }
             l("sent " + counter);
                counter++;
                counter = (byte) (counter % 16);
        }

    }
}

// END MAIN LOOP
private BroadcastReceiver mPermissionReceiver = new PermissionReceiver(
        new IPermissionListener() {

            public void onPermissionDenied(UsbDevice d) {
                l("Permission denied on " + d.getDeviceId());
            }
        });

private static interface IPermissionListener {
    void onPermissionDenied(UsbDevice d);
}

public final static String TAG = "USBController";

private void l(Object msg) {
    Log.d(TAG, ">==< " + msg.toString() + " >==<");
}

private void e(Object msg) {
    Log.e(TAG, ">==< " + msg.toString() + " >==<");
}

Может ли кто-нибудь сказать мне, какие изменения мне нужно сделать? Заранее благодарю вас.

Ответ 1

Есть несколько проблем.

Я предполагаю, что прокомментированная строка - это то, где у вас проблемы. Возможно, вы захотите переформатировать отступ кода и предоставить дополнительную информацию. В любом случае, предполагая, что ваша проблема происходит здесь:

byte counter=0;
//conn.bulkTransfer(epOUT, new byte[]{msData}, 1, 0);

Непосредственная проблема, которую я вижу - epOut, конечная точка, по которой вы отправляете данные, является нулевой. Так что, конечно, это провалится. Вы отправляете данные ни к чему. Я выполнил ссылку, которую вы отправили в код примера, который вы скопировали, у них есть строка, показывающая:

epOUT = usbIf.getEndpoint(i);

Я бы настоятельно рекомендовал, по крайней мере, сначала убедиться, что вы понимаете исходный код или работаете в своей собственной программе, прежде чем приступать к изменениям. НЕ просто скопируйте приведенную выше строку кода, чтобы "исправить" вашу проблему.