2012-10-28 41 views
10

我發現一個問題發佈用於讀取FTDI設備的USB數據。 Transferring data USB 我使用此代碼爲多產的設備,並可以檢測到的USB等,除了conn.bulkTransfer()給出-1。從USB(多產)到android設備的數據傳輸

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() + " >==<"); 
} 

有誰能告訴我我需要做什麼改變嗎?先謝謝你。

+0

您是否找到解決方案? – user427969

回答

0

有幾個問題。

我認爲註釋掉的線是你遇到問題的地方。您可能需要重新格式化您的代碼縮進並提供更多信息。在任何情況下,假設您的問題在這裏發生:

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

眼前的問題,我看到 - epOut,端點到您要發送的數據爲空。所以當然會失敗。你發送數據到什麼都不是。我跟着張貼到您複製示例代碼的鏈接,他們有一個線顯示:

epOUT = usbIf.getEndpoint(i); 

我強烈建議在最起碼,你首先要確保你理解的原代碼或有工作在開始進行更改之前,請在自己的程序中進不要只是複製上面的代碼行來「解決」你的問題。