2012-05-17 104 views
0

我一直在試圖弄清楚一段時間,但我看到的每一種方式都不起作用,我試圖將一些字符串數據發送到USB設備,設備應該發回我想要的數據還是發回了「壞命令」,大概是11個字節?現在我回來的只是2個字節,1和192.我試圖總共發送9個字節,「$ fdump G」和「/ n」。不管我做什麼都行不通。USB傳輸Android

這裏是我的代碼,我不知道如何將字節更改爲字符串或字符,但我會這樣做,一旦我開始獲取數據,因爲我知道什麼是返回至少是11個字節。

for(;;){//this is the main loop for transferring  

       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]; 
       l("in " + conn.bulkTransfer(epIN, buffer, 4096,500)); 

       StringBuilder byStr = new StringBuilder(); 

       //This shows what's coming in 
       for(int i = 0; i < buffer.length; i++){ 
        if(buffer[i] != 0){ 
        byStr.append(buffer[i]); 
        l(byStr);} 
       } 
       //this shows the complete string 
       l(byStr); 

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

我真的不知道爲什麼它不工作。我在Android上有很多技巧,但我無法理解這一點。

ENIN和ENOUT是終點:

epIN = usbIf.getEndpoint(i); 

epOUT = usbIf.getEndpoint(i); 

另外conn是USB設備的連接。

  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; 
+0

[Android上的USB可能有重複。 ](http://stackoverflow.com/questions/10644228/usb-on-android) – Hasturkun

+0

是的,抱歉沒有認爲它張貼。 – FabianCook

回答

1
epIN = usbIf.getEndpoint(i); 
epOUT = usbIf.getEndpoint(i); 

如果這裏i(端點索引)具有相同的價值都要求你將最終獲得相同的終點。然而,端點有一個方向,不能用於發送接收數據的。由於bulkTransfer()方法使用端點地址來分別確定兩次讀取或兩次寫入最終的方向。

請注意,接口中的端點索引與端點地址不匹配。接口是端點(具有硬件地址)的邏輯映射。 我想你可能想從IN端點1(地址:0x81)讀取並寫入OUT端點1(地址:0x01)。因此,您爲i使用相同的值。但是,IN 1和OUT 1不是相同的端點。

檢查設備描述符以找出您要與之通信的端點。接口描述符後的第一個提到的端點可以通過UsbInterface.getEndpoint(0)訪問,而不管它的物理地址如何。檢查該端點的方向並適當使用它。使用UsbInterface.getEndpoint(1)查找另一個端點(假設它們是一個接口中的兩個第一端點)。

btw:你的字節緩衝區太大了。批量傳輸數據包的最大容量爲全速64字節,高速設備512字節。

+0

我是for語句中的int,這些都很好,我怎麼能夠傳輸大量的數據呢? – FabianCook