2016-08-09 15 views
-1

java로 USB 장치를 사용하는 적절한 방법을 찾고 있습니다. StackOverflow의 게시물 대부분은 usb4java를 사용하는 것이 좋습니다.이 경우 2014 년 초에 최신 활동이있는 것으로 보이므로 아직 활성화되어 있는지 확실하지 않습니다.USB4Java는 libusb 1.0 또는 0.1에 대한 래퍼입니까? 새로운 자바 개발에 권장 되는가?

어쨌든 페이지에서 "libusb 1.0 라이브러리를 기반으로합니다."라고 말합니다. 그런 다음 장치 드라이버를 설치하려고 할 때 Zadig를 권장 (https://github.com/libusb/libusb/wiki/Windows#How_to_use_libusb_on_Windows)으로 사용했습니다.

"libusb-win32"드라이버를 사용하여 usb4java를 작동 시켰습니다. 그러나 "libusb-win32"웹 사이트에 가면 "libusb-win32는 USB 라이브러리 libusb-0.1의 포트입니다."그리고 여기 http://libusb.org/wiki/APIs#libusb-0.1legacyAPI에서 "개발 상태 : libusb-0.1는 더 이상 사용되지 않습니다. "

이것은 모두 매우 혼란 스럽습니다. 그래서 USB4Java가 libusb 1.0 또는 0.1을 사용하는지 먼저 알고 싶습니다. 또한 새로운 개발이나 어떤 방법으로 진행할 것이 권장됩니다. JAVA 사용시 USB 장치를 너무 많이 지원하지는 않습니다.

UPDATE :

감사 dryman. 좋은 설명. libusb-win32와 결합 된 usb4java의 문제점은 대기 시간입니다. 내 트랜잭션은 매 10ms마다 발생하므로 손실 된 데이터를 감당할 수 없기 때문에 버퍼링을 시작해야하고 15 버퍼가 있으므로 최대 지연 시간은 150ms가됩니다. libusb-win32를 사용하여 usb4java를 장기간 (시간), 나는 가끔씩 1 초 이상의 대기 시간을 갖는다는 것을 안다. 나는 WinUSB을 시도했지만 어떤 이유로 내가 얻을 : 이제 더 신뢰할 수 수 있음을 언급

# 
# 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] 

, 나는 그것을 시도 줄 것이다 나는 그것을 해결하기 위해 노력할 것입니다.

BTW : 아래 코드에서 전송 (LibUsb.submitTransfer (transfer);)을 제출하려고하면 액세스 위반이 발생합니다.

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

전송 모드로 무엇을 사용합니까? 신뢰할 수있는 대역폭과 응답 시간을 위해서는 등시 전송을 사용해야합니다. 물론 장치가이를 지원해야합니다. – dryman

+0

그리고 접근 위반에 관한 : 나는 그곳에서 무슨 일이 일어나고 있는지 모른다. 이 오류를 유발하는 예제 코드를 게시 할 수 있습니까? – dryman

+0

등시성 대량 전송을 사용하고 있습니다. 그리고 액세스 위반은 원래 질문에 방금 추가 한 코드 내에서 발생합니다. –

답변

1

먼저 다른 libusbs에 대한 것 또는 두 가지. 거기에는 다른 구현과 드라이버의 공평한 분배가 존재합니다. libusb 원본은 libusbx로 분기되었습니다. 원래의 libusb가 실패했고 libusbx가 libusb를 이름으로 사용했습니다. 그래서 더 많은 혼란이 있습니다. libusb1 (libusb-win32), libusbK 및 WinUSB와 같이 libusb1을 사용하는 Windows 용 세 가지 다른 드라이버가 있습니다 (만 약 순서대로).

이제 usb4java에 대해 알아보십시오. 내가 아는 한 그들은 libusb1을 사용합니다. libusb1은 여전히 ​​libusbK를 통해 libusb0 드라이버와 함께 작동 할 수 있지만, Winusb를 대신 사용하는 것이 좋습니다. 왜냐하면 내 개인적인 경험에서 libusb의 개발자는 자신을 권장하기 때문입니다. libusb0 지원은 일종의 호의적 인 것처럼 보입니다.

WinUSB를 시도했는지 또는 작동하지 않았는지 아무 것도 쓰지 않으므로 WinUSB에서 문제가 발생했는지 묻는 것이 좋습니다.

+0

구현 한 즉시 작동하는지 알려 드리겠습니다. libusbx sourceforgepage에서 "libusbx is OBSOLETE - http://libusb.info를 사용하십시오"라고 알려 주셨고 libusb 라이브러리를 가리키고 있습니다. –

+0

네가 정확히 쓴 것입니다. libusbx forked libusb, libusb failed 그리고 libusbx 자체가 libusb로 이름이 바뀌 었습니다. libusb.org와 libusb.info의 차이점에 유의하십시오. – dryman