usb4java_使用java(usb4java)从libusb中的usb设备读取数据

我使用libusb api从java中的usb设备读取数据。我能够将数据写入设备但我无法从设备读取数据。我可以读取第一个数据组(大小:1个字节)但是当我想读取第二个数据组(大小:2个字节)时我得到超时错误(USB错误7:控制传输失败:操作超时)

我的代码就是这样;

buffer = ByteBuffer.allocateDirect(1);

//03

LibUsb.controlTransfer(handle,(byte) (LibUsb.REQUEST_TYPE_VENDOR | LibUsb.ENDPOINT_IN), (byte) 0xdb, (short) 0, (short) 0, buffer, 0);

//00 04

buffer.rewind();

buffer = ByteBuffer.allocateDirect(2);

transferred = LibUsb.controlTransfer(handle,(byte) (LibUsb.REQUEST_TYPE_VENDOR | LibUsb.ENDPOINT_IN), (byte) 0xf0, (short) 0x1c30, (short) 0, buffer, 0);

if(transferred < 0){

throw new LibUsbException("Control Transfer Failed", transferred);

}

我用C语言实现了这种数据传输,但我必须在java中实现。请帮帮我。

编辑:我正在更改超时但我的应用程序没有变化。

编辑:我可以读取1字节数据。当我想读取2字节数据时,我收到错误。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在 C++ 使用 libusb 库来控制 USB 设备的电源状态需要以下步骤: 1. 初始化 libusb使用 `libusb_init()` 函数初始化 libusb 库。 ```c++ libusb_context *ctx = nullptr; int rc = libusb_init(&ctx); if (rc < 0) { // 初始化失败 return; } ``` 2. 找到 USB 设备 使用 `libusb_get_device_list()` 函数获取系统所有的 USB 设备列表,然后使用 `libusb_get_device_descriptor()` 函数获取每个设备的描述符,找到目标设备。 ```c++ libusb_device **devs = nullptr; ssize_t cnt = libusb_get_device_list(ctx, &devs); if (cnt < 0) { // 获取设备列表失败 return; } for (int i = 0; i < cnt; i++) { libusb_device *dev = devs[i]; libusb_device_descriptor desc = {}; int rc = libusb_get_device_descriptor(dev, &desc); if (rc < 0) { // 获取设备描述符失败 continue; } // 判断是否为目标设备 if (desc.idVendor == VENDOR_ID && desc.idProduct == PRODUCT_ID) { // 找到目标设备 // ... } } libusb_free_device_list(devs, 1); ``` 3. 分离内核驱动程序 在进行 USB 设备操作之前,需要将内核驱动程序与设备分离。使用 `libusb_detach_kernel_driver()` 函数将设备的接口从内核驱动程序分离出来。 ```c++ libusb_device_handle *handle = nullptr; int rc = libusb_open(dev, &handle); if (rc < 0) { // 打开设备失败 return; } // 分离内核驱动程序 rc = libusb_detach_kernel_driver(handle, INTERFACE_NUMBER); if (rc < 0) { // 分离失败 libusb_close(handle); return; } ``` 4. 访问设备接口 使用 `libusb_claim_interface()` 函数访问设备的接口。 ```c++ // 访问设备接口 rc = libusb_claim_interface(handle, INTERFACE_NUMBER); if (rc < 0) { // 访问失败 libusb_close(handle); return; } ``` 5. 控制设备电源状态 使用 `libusb_control_transfer()` 函数发送控制传输命令来控制设备的电源状态。 ```c++ // 控制设备电源状态 unsigned char data[1] = {POWER_ON}; rc = libusb_control_transfer( handle, LIBUSB_REQUEST_TYPE_VENDOR | LIBUSB_RECIPIENT_INTERFACE | LIBUSB_ENDPOINT_OUT, CONTROL_REQUEST, CONTROL_VALUE, INTERFACE_NUMBER, data, sizeof(data), TIMEOUT_MS); if (rc < 0) { // 控制失败 libusb_release_interface(handle, INTERFACE_NUMBER); libusb_close(handle); return; } ``` 6. 释放资源 使用 `libusb_release_interface()` 函数释放设备接口,然后使用 `libusb_close()` 函数关闭设备句柄,最后使用 `libusb_exit()` 函数释放 libusb 库的资源。 ```c++ libusb_release_interface(handle, INTERFACE_NUMBER); libusb_close(handle); libusb_exit(ctx); ``` 完整的代码示例: ```c++ #include <libusb-1.0/libusb.h> #define VENDOR_ID 0x1234 #define PRODUCT_ID 0x5678 #define INTERFACE_NUMBER 0 #define POWER_ON 1 #define CONTROL_REQUEST 0x01 #define CONTROL_VALUE 0x02 #define TIMEOUT_MS 1000 int main() { // 初始化 libusblibusb_context *ctx = nullptr; int rc = libusb_init(&ctx); if (rc < 0) { // 初始化失败 return 1; } // 找到 USB 设备 libusb_device **devs = nullptr; ssize_t cnt = libusb_get_device_list(ctx, &devs); if (cnt < 0) { // 获取设备列表失败 libusb_exit(ctx); return 1; } libusb_device *dev = nullptr; for (int i = 0; i < cnt; i++) { libusb_device *d = devs[i]; libusb_device_descriptor desc = {}; rc = libusb_get_device_descriptor(d, &desc); if (rc < 0) { // 获取设备描述符失败 continue; } // 判断是否为目标设备 if (desc.idVendor == VENDOR_ID && desc.idProduct == PRODUCT_ID) { dev = d; break; } } libusb_free_device_list(devs, 1); if (dev == nullptr) { // 没有找到设备 libusb_exit(ctx); return 1; } // 分离内核驱动程序 libusb_device_handle *handle = nullptr; rc = libusb_open(dev, &handle); if (rc < 0) { // 打开设备失败 libusb_exit(ctx); return 1; } rc = libusb_detach_kernel_driver(handle, INTERFACE_NUMBER); if (rc < 0) { // 分离失败 libusb_close(handle); libusb_exit(ctx); return 1; } // 访问设备接口 rc = libusb_claim_interface(handle, INTERFACE_NUMBER); if (rc < 0) { // 访问失败 libusb_close(handle); libusb_exit(ctx); return 1; } // 控制设备电源状态 unsigned char data[1] = {POWER_ON}; rc = libusb_control_transfer( handle, LIBUSB_REQUEST_TYPE_VENDOR | LIBUSB_RECIPIENT_INTERFACE | LIBUSB_ENDPOINT_OUT, CONTROL_REQUEST, CONTROL_VALUE, INTERFACE_NUMBER, data, sizeof(data), TIMEOUT_MS); if (rc < 0) { // 控制失败 libusb_release_interface(handle, INTERFACE_NUMBER); libusb_close(handle); libusb_exit(ctx); return 1; } // 释放资源 libusb_release_interface(handle, INTERFACE_NUMBER); libusb_close(handle); libusb_exit(ctx); return 0; } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值