Data transfer from USB(prolific) to android device
Asked Answered
B

1

10

I found a question posted for reading of USB data for FTDI devices. Transferring data USB I used this code for prolific device, and the usb can be detected, etc except that the the conn.bulkTransfer() gives a -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() + " >==<");
}

Can anyone tell me what changes I need to make? Thank you in advance.

Bondstone answered 28/10, 2012 at 11:39 Comment(1)
Did you found solution?Beatup
N
0

There are several issues.

I assume that the commented out line is where you're having problems. You may want to reformat your code indentation and supply more information. In any case, assuming that your issue is occurring here:

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

The immediate problem that I see - epOut, the endpoint to which you are sending data is null. So of course it will fail. You're sending data to nothing. I followed the link that you posted to the example code that you copied, they have a line showing:

epOUT = usbIf.getEndpoint(i);

I would strongly suggest at the very least, you first make sure you understand the original code or have it working in your own program before you start making changes. DON'T just copy the above line of code to "fix" your problem.

Nitrate answered 14/11, 2013 at 23:19 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.