2017-02-03 2 views
1

J'ai déjà vu beaucoup de questions ici à propos de bulkTransfer, la plupart d'entre elles ont utilisé les mauvaises interfaces pour lire et écrire mais je suis sûr que j'ai choisi les bonnes interfaces:Pas de réponse de Android BulkTransfer avec bons Endpoints

private UsbManager usbManager; 
private UsbDevice usbDevice; 
private UsbDeviceConnection usbDeviceConnection; 
private UsbInterface usbInterface; 
private UsbEndpoint readEndpoint; 
private UsbEndpoint writeEndpoint; 
private UsbEndpoint interruptEndpoint; 
private PtpSession ptpSession; 

public boolean Connect(UsbManager usbManager,UsbDevice usbDevice, PtpSession ptpSession) 
{ 
    if(usbManager == null ||usbDevice == null||ptpSession == null) 
     return false; 
    else 
    { 
     this.usbManager = usbManager; 
     this.usbDevice = usbDevice; 
     this.ptpSession = ptpSession; 

     for (int i = 0; i < this.usbDevice.getInterfaceCount(); i++) { 
      UsbInterface uintf = this.usbDevice.getInterface(i); 
      if (uintf.getInterfaceClass() == UsbConstants.USB_CLASS_STILL_IMAGE) { 
       Log.d(TAG, "Imaging USB interface found"); 
       this.usbInterface = uintf; 
       break; 
      } 
     } 
    } 

    // find the wright usb endpoints 
    if(usbInterface == null) 
     return false; 
    else 
    { 
     for(int i = 0; i < usbInterface.getEndpointCount();i++) 
     { 
      UsbEndpoint ep = usbInterface.getEndpoint(i); 
      if (ep.getDirection() == UsbConstants.USB_DIR_IN) { 
       if(ep.getType() == UsbConstants.USB_ENDPOINT_XFER_BULK) 
       { 

        readEndpoint = ep; 
       } 
       else if(ep.getType() == UsbConstants.USB_ENDPOINT_XFER_INT) 
       { 
        interruptEndpoint = ep; 

       } 
      } else if (ep.getType() == UsbConstants.USB_ENDPOINT_XFER_BULK) { 
       writeEndpoint = ep; 
      } 
     } 

     this.usbDeviceConnection = usbManager.openDevice(usbDevice); 
     usbDeviceConnection.claimInterface(usbInterface,true); 
    } 

    if(readEndpoint == null || writeEndpoint == null ||interruptEndpoint == null) 
     return false; 
    return true; 
} 

Cette partie du code semble fonctionner comme il le devrait, alors il y a deux autres méthodes pour lire et écrire des données:

private boolean writeData(byte[] data) 
{ 
    int retry = 0; 
    while (usbDeviceConnection.bulkTransfer(writeEndpoint, data, data.length, 5000) != data.length) 
    { 
     retry++; 
     if (retry > 4) 
     { 
      return false; 
     } 
    } 
    return true; 
} 

private byte[] readData() 
{ 
    long rStart = System.currentTimeMillis(); 
    byte[] mReadData = new byte[30]; 
    while (true) { 
     int bytesCount = usbDeviceConnection.bulkTransfer(readEndpoint, mReadData, mReadData.length, 5000); 
     if (bytesCount >= 0) { 
      return mReadData; 
     } 
     else if (System.currentTimeMillis() - rStart > 5000) { 
      return new byte[]{}; 
     } else { 
      Log.e(TAG, String.format("Bulk read -1 cmd")); 
     } 


    } 
} 

Je peux envoyer des données et obtenir une rétroaction positiv de la méthode writeData . Ensuite, j'attends un certain temps (100 ou même 1000ms) et j'essaie de lire Data. Et je n'ai jamais eu de données à lire et j'ai toujours -1 comme retour (jusqu'à ce que la méthode renvoie un tableau vide après 5 secondes). J'ai déjà essayé de changer la taille du tableau mReadData en d'autres valeurs mais rien n'a fonctionné jusqu'à présent (une taille de 30 octets de données serait la valeur attendue pour un bloc ResponseData typique au protocole PTP). Dans l'ensemble, j'essaie de lire les données de mon Nikon D3200 avec mon Smartphone (Galaxy S7 avec Android 6.0.1 en cours d'exécution) avec l'adaptateur USB-OTG d'origine et je suis sûr que mon code est le problème, mais après des heures d'essai différentes choses que je n'ai vraiment aucune idée de ce qu'est le problème.

Voici un lien vers la norme ISO 15740 que je l'ai utilisé: Link to ISO 15740

Peut-être que quelqu'un d'entre vous a une idée quel est mon problème?

Merci à l'avance, Dominik

Répondre

0

le code suivant ne fonctionnera pas

private boolean writeData(byte[] data) 
{ 
    int retry = 0; 
    while (usbDeviceConnection.bulkTransfer(writeEndpoint, data, data.length, 5000) != data.length) 
    { 
     retry++; 
     if (retry > 4) 
     { 
      return false; 
     } 
    } 
    return true; 
} 

, utilisez plutôt la suivante pour vérifier si l'état de la connexion

int ret = usbDeviceConnection.bulkTransfer(writeEndpoint, data, data.length, 5000; 


    if(ret < 0) 
        { 
         Log.d("TAG", "Error happened!"); 
        } 
        else if(ret == 0) 
        { 
         Log.d("TAG", "No data transferred!"); 
        } 
        else 
        { 
         Log.d("TAG", "success!"); 
        } 

(https://www.developer.android.com/studio/debug/am-logcat.html au lieu de vous connecter peut également utiliser try {...} catch {...} blocs ou logcat , ...)

copié de android usb UsbDeviceConnection.bulkTransfer returns -1

alors il y a plusieurs possibilités pour lesquelles vous d'écriture/lecture aucune donnée

  • erreur de programmation

    (est peut-être une erreur de référence parce que la méthode writeData() ne sait pas la référence à l'objet usbDeviceConnection) essayer de donner à la méthode en tant que paramètre comme

    private UsbDeviceConnection usbDeviceConnection; 
    private boolean writeData(UsbDeviceConnection usbDeviceConnection, byte[] data) { ... } 
    

    et invoquer la méthode avec

    writeData(usbDeviceConnection, ...); 
    

(http://www.programcreek.com/java-api-examples/index.php?api=android.hardware.usbUsbDeviceConnection)

même pour la méthode readData()

https://developer.android.com/reference/android/hardware/usb/UsbDeviceConnection.html

+0

Merci pour la réponse rapide! Cela ne peut pas être une erreur de référence car le code est dans la même classe. J'ai implémenté la méthode d'écriture donnée et ça marche très bien (la sortie est: "succès!"). J'ai essayé getMaxPacketSize pour définir la taille du tableau d'octets qui est envoyé et lu, également sans succès. Pour s'assurer qu'il n'y a pas de problème d'autorisation, j'ai essayé usbManager.hasPermission (usbDevice) - ce qui me donne vrai. – Dominik

+0

Quelle est la valeur de retour i de 'int i = ... .getMaxPacketSize()' des points de terminaison IN et OUT? –

+0

writeEndpoint.getMaxPacketSize() = 512 et readEndpoint.getMaxPacketSize() = 512 – Dominik