2012-05-03 7 views
12

Я пытаюсь отправить и получить данные через USB, мое устройство, Acer Iconia A500 имеет все необходимое для подключения к устройству и всему, что хорошо и работает нормально, но когда я пытаюсь отправлять и получать данные он не ведет себя так, как ожидалось. Это мой кодПередача данных USB

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-устройствах, в конечном он все равно вернется еще несколько. Является ли мой код даже близким к правильному? Я основывал его на USB-файле на серийной статье по серверу.

ответ

16

Я пытался отправить данные по неправильной скорости передачи.

Вот код, который работает. Публикация его для всех, кто использует устройства 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); 
      } 
     } 
    }; 
+1

Огромное спасибо –

+0

Без проблем. Некоторое время назад я сделал это. – FabianCook

+0

Можете ли вы включить свои заявления об импорте? – rolls

Смежные вопросы