2016-08-09 1 views
-1

J'essaie de trouver la bonne façon d'utiliser un périphérique USB avec Java. La plupart des articles de StackOverflow recommandent d'utiliser usb4java, pour lequel la dernière activité semble être début 2014, donc je ne suis pas sûr que ce soit toujours actif. Quoi qu'il en soit, en y creusant un peu, sur la page, il est écrit "Il est basé sur la librairie natif libusb 1.0". Ensuite, en essayant d'installer le pilote de périphérique, j'ai utilisé Zadig comme recommandé (https://github.com/libusb/libusb/wiki/Windows#How_to_use_libusb_on_Windows).USB4Java est-il un wrapper pour libusb 1.0 ou 0.1? Est-il recommandé pour les nouveaux développements Java?

J'ai utilisé usb4java en utilisant le pilote "libusb-win32". Mais quand vous allez sur le site "libusb-win32", il mentionne que "libusb-win32 est un port de la bibliothèque USB libusb-0.1", et encore plus ici http://libusb.org/wiki/APIs#libusb-0.1legacyAPI en mentionne que "Statut de développement: libusb-0.1 est obsolète "

Tout cela est très confus, donc d'abord je voudrais savoir si USB4Java utilise libusb 1.0 ou 0.1. Et aussi est-il recommandé pour tout nouveau développement ou ce qui serait le chemin à parcourir, il ne semble pas y avoir trop de support pour les périphériques USB sur l'utilisation de JAVA.

MISE À JOUR:

Merci Dryman. Bonne explication. Mon problème avec usb4java combiné avec libusb-win32 est la latence. Mes transactions ont lieu toutes les 10ms et je ne peux pas me permettre de perdre des données, c'est pourquoi j'ai dû tamponner et j'ai 15 tampons, donc mon délai maximum serait de 150ms.Pendant l'évaluation de usb4java avec libusb-win32 pendant de longues périodes (heures), Je vois que de temps en temps j'ai des latences de plus de 1s. J'ai essayé WinUSB mais pour une raison quelconque, je reçois:

# 
# A fatal error has been detected by the Java Runtime Environment: 
# 
# EXCEPTION_ACCESS_VIOLATION (0xc0000005) at pc=0x000000006b6051c2, pid=6284, tid=6836 
# 
# JRE version: Java(TM) SE Runtime Environment (8.0_45-b14) (build 1.8.0_45-b14) 
# Java VM: Java HotSpot(TM) 64-Bit Server VM (25.45-b02 mixed mode windows-amd64 compressed oops) 
# Problematic frame: 
# C [libusb-1.0.dll+0x51c2] 

Maintenant que vous mentionnez qu'il pourrait être plus fiable, je vais essayer et je vais essayer de le réparer. BTW: la violation d'accès se produit lorsque j'essaie de soumettre le transfert (LibUsb.submitTransfer (transfert);) dans le code ci-dessous.

public static void write(DeviceHandle handle, byte[] data, 
     TransferCallback callback) 
    { 
     ByteBuffer buffer = BufferUtils.allocateByteBuffer(data.length); 
     buffer.put(data); 
     Transfer transfer = LibUsb.allocTransfer(); 
     LibUsb.fillBulkTransfer(transfer, handle, OUT_ENDPOINT, buffer, 
      callback, null, TIMEOUT); 
//  System.out.println("Sending " + data.length + " bytes to device"); 
     int result = LibUsb.submitTransfer(transfer); 
     if (result != LibUsb.SUCCESS) 
     { 
      throw new LibUsbException("Unable to submit transfer", result); 
     } 
    } 
+0

Qu'est-ce que vous utilisez comme mode de transfert? Pour une bande passante et un temps de réponse fiables, vous devez utiliser des transferts isochrones. Bien sûr, l'appareil doit supporter cela. – dryman

+0

Et à propos de la violation d'accès: Je ne sais pas ce qui se passe là-bas. Pouvez-vous poster un exemple de code qui déclenche cette erreur? – dryman

+0

J'utilise des transferts en vrac isochrones. Et la violation d'accès se passe dans le code que je viens d'ajouter dans la question initiale –

Répondre

1

D'abord une chose ou deux aux différentes libusbs. La chose est qu'il existait une part équitable de différentes implémentations et pilotes. L'original de libusb a été forké à libusbx. L'original de libusb a échoué et libusbx a pris le nom de libusb. Donc, il y a encore plus de confusion. Il existe 3 pilotes différents pour Windows travaillant avec libusb1 (dans l'ordre chronologique): libusb0 (libusb-win32), libusbK et WinUSB.

Maintenant à propos de usb4java. Pour autant que je sache, ils utilisent libusb1. libusb1 est toujours capable de fonctionner avec le pilote libusb0 via libusbK mais je recommande d'utiliser WinUSB à la place, car dans mon expérience personnelle, cela fonctionne mieux et les gars de libusb le recommandent eux aussi. Le support de libusb0 semble être une sorte de courtoisie seulement.

Vous n'écrivez rien si vous avez essayé WinUSB ou comment cela n'a pas fonctionné, donc je vous recommande de l'essayer ou de poser une question sur vos problèmes avec WinUSB.

+0

Je viens de le trouver dans la libusbx sourceforgepage: "libusbx est OBSOLÈTE - utilise http://libusb.info" et pointe vers la bibliothèque libusb –

+0

Oui c'est exactement ce que j'ai écrit. libusbx forked libusb, libusb a échoué et ensuite libusbx s'est renommé libusb. Attention à la différence entre libusb.org et libusb.info. – dryman