android - 传输数据 USB

标签 android usb ftdi

我正在尝试通过 USB 发送和接收数据,我的设备 Acer Iconia A500 具有连接到设备所需的一切以及一切,这很好并且工作正常,但是当我尝试发送和接收数据时它没有'没有像预期的那样表现。这是我的代码

for( ; ; ) { //this is the main loop for transferring   
    String get = "$getPos";
    byte[] getBytes = get.getBytes();
    conn.bulkTransfer( epOUT, getBytes, getBytes.length, 500 );

    try {
        Thread.sleep( 500 );
        byte[] buffer = new byte[4096];
        conn.bulkTransfer( epIN, buffer, 4096, 500 );
        StringBuilder byStr = new StringBuilder();

        for( int i = 0; i < buffer.length; i++ ) {
            if( buffer[i] != 0 ) {
                byStr.append( buffer[i] + ", " );
            }
        }

        l( byStr );
    }
    catch( InterruptedException e ) {
        e.printStackTrace();
    }

    if( mStop ) {
        mStopped = true;
        return;
    }

    l( "sent " + counter );
    counter++;
    counter = (byte)( counter % 16 );
}

它的意思是返回一个大约 80 个字符长的字节数组,但它只返回两个字节,即 1 和 96,如果 USB 设备端出现错误,它仍然会返回比两个多几个字节。我的代码是否接近正确?我基于 serverbox 的 USB 转串行文章。

最佳答案

我试图以错误的波特率发送数据。

这是有效的代码。将它发布给所有使用 FTDI 设备并需要帮助的人。

private Runnable mLoop = new Runnable() {

        @Override
        public void run() {
            UsbDevice dev = sDevice;
            if (dev == null)
                return;
            UsbManager usbm = (UsbManager) getSystemService(USB_SERVICE);
            UsbDeviceConnection conn = usbm.openDevice(dev);
            l("Interface Count: " + dev.getInterfaceCount());
            l("Using "
                    + String.format("%04X:%04X", sDevice.getVendorId(),
                            sDevice.getProductId()));

            if (!conn.claimInterface(dev.getInterface(0), true))
                return;

            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, 0x0034, 0, null, 0, 0);// baudrate
                                                                    // 57600
            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;

            UsbInterface usbIf = dev.getInterface(0);
            for (int i = 0; i < usbIf.getEndpointCount(); i++) {
                l("EP: "
                        + String.format("0x%02X", usbIf.getEndpoint(i)
                                .getAddress()));
                if (usbIf.getEndpoint(i).getType() == UsbConstants.USB_ENDPOINT_XFER_BULK) {
                    l("Bulk Endpoint");
                    if (usbIf.getEndpoint(i).getDirection() == UsbConstants.USB_DIR_IN)
                        epIN = usbIf.getEndpoint(i);
                    else
                        epOUT = usbIf.getEndpoint(i);
                } else {
                    l("Not Bulk");
                }
            }

            for (;;) {// this is the main loop for transferring
                try {
                    Thread.sleep(100);
                } catch (InterruptedException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
                String get = "$fDump G" + "\n";
                l("Sending: " + get);

                byte[] by = get.getBytes();

                // This is where it sends
                l("out " + conn.bulkTransfer(epOUT, by, by.length, 500));

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

                StringBuilder str = new StringBuilder();

                if (conn.bulkTransfer(epIN, buffer, 4096, 500) >= 0) {
                    for (int i = 2; i < 4096; i++) {
                        if (buffer[i] != 0) {
                            str.append((char) buffer[i]);
                        } else {
                            l(str);
                            break;
                        }
                    }

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

                if (mStop) {
                    mStopped = true;
                    return;
                }
                l("sent " + counter);
                counter++;
                counter = (byte) (counter % 16);
            }
        }
    };

关于android - 传输数据 USB,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10429615/

相关文章:

python - 在 Python libmpsse 中实现 C 代码

android - 如何在 Android Studio 中调整 AVD 模拟器窗口的大小?

android - 更改可扩展 ListView 的图标

android - iBeacon 可以区分 1 厘米和 10 厘米吗?

java - 如何用Java平滑移动鼠标光标?

android.hardware.usb UsbManager 类公共(public)方法 getDeviceList 和 getAccessoryList 返回 null

linux - 在 Linux 上,通过 USB 使用 HID 报告的好方法是什么?

java - Ubuntu RXTX 无法识别 USB 串口设备

c++ - qt 5.2串口写问题与windows 7

c - 使用 cygwin 通过 FTDI 使用 ftd2xx.lib 编译 c 应用程序