2012-05-03 19 views
12

Estoy tratando de enviar y recibir datos a través de USB, mi dispositivo, Acer Iconia A500 tiene todo lo necesario para conectarse al dispositivo y todo, está bien y funciona correctamente, pero cuando intento enviar y recibir datos no se comporta como se esperaba Este es mi códigoTransfiriendo datos 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); 
} 

su significado para devolver una matriz de bytes de 80 caracteres de longitud, pero sólo devuelve dos bytes de atrás, que son 1 y 96, si hubo un error en los dispositivos USB acabar con ella todavía volvería unos pocos más que dos. ¿Mi código está cerca de ser correcto? Lo basé del USB al artículo serial por el servidor.

Respuesta

16

Estaba tratando de enviar datos a una velocidad en baudios incorrecta.

Aquí está el código que funciona. Publicarlo para todos los que usan dispositivos FTDI y necesitan ayuda.

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

Muchas gracias –

+0

No hay problema. Ha pasado un tiempo desde que hice esto. – FabianCook

+0

¿Puede incluir sus declaraciones de importación? – rolls