基于usb4java实现的java下的usb通信

本文介绍了一个使用java usb4java库进行USB通信的项目,讲解了配置、设备查找、接口声明、同步和异步I/O操作。在Linux上遇到权限问题时,需要配置udev规则以允许用户访问设备。示例代码展示了如何与USB设备交互,但对Arduino编程的具体细节未详述。
摘要由CSDN通过智能技术生成

项目地址:点击打开

使用java开发的好处就是跨平台,基本上java的开发的程序在linux、mac、MS上都可以运行,对应这java的那句经典名言:一次编写,到处运行。这个项目里面有两种包选择,一个是low-level(libus)一个是high-level(javax-usb),相关的优缺点在官方网站上已经说明了,我这里就不翻译了,不过前者好像基于libusb已经好久不更新了,所以还是选择后者。

配置:你需要在你包的根目录下新建一个名为:javax.usb.properties的文件,里面的内容是这样的:

javax.usb.services = org.usb4java.javax.Services

查找usb设备,其实通过usb通信流程大体上都是一致,之前我做过android与arduino通过usb通信,然后java通信走了一遍之后发现是一样的。USB 设备棵树上进行管理所有物理集线器连接一个虚拟的 USB集线器更多集线器可以连接这些集线器任何集线器可以大量连接的 USB设备

通常需要使用之前搜索特定设备,下面的一个例子如何扫描一个特定供应商产品 id 第一个设备设备:

public UsbDevice findDevice(UsbHub hub, short vendorId, short productId)
{
    for (UsbDevice device : (List<UsbDevice>) hub.getAttachedUsbDevices())
    {
        UsbDeviceDescriptor desc = device.getUsbDeviceDescriptor();
        if (desc.idVendor() == vendorId && desc.idProduct() == productId) return device;
        if (device.isUsbHub())
        {
            device = findDevice((UsbHub) device, vendorId, productId);
            if (device != null) return device;
        }
    }
    return null;
}

接口

当你想要与一个接口或者这个接口的端点进行通信时,那么你在使用它之前必须要claim它,并且当你结束时你必须释放它。比如:下面的代码:

UsbConfiguration configuration = device.getActiveUsbConfiguration();
UsbInterface iface = configuration.getUsbInterface((byte) 1);
iface.claim();
try
{
    ... Communicate with the interface or endpoints ...
}
finally        
{
    iface.release();
}

可能出现的一种情况是你想要通信的接口已经被内核驱动使用,在这种情况下你可能需要通过传递一个接口策略到claim方法以此尝试强制claim:

iface.claim(new UsbInterfacePolicy()
{            
    @Override
    public boolean forceClaim(UsbInterface usbInterface)
    {
        return true;
    }
});

需要注意的是,接口策略只是为了实现基础USB的一个提示.接口策略在MS-Windows上将被忽略,因为libusb在windows上不支持分派驱动。

同步 I/O

这个example发送8个字节到端点0x03:

UsbEndpoint endpoint = iface.getUsbEndpoint(0x03);
UsbPipe pipe = endpoint.getUsbPipe();
pipe.open();
try
{
    int sent = pipe.syncSubmit(new byte[] { 1, 2, 3, 4, 5, 6, 7, 8 });
    System.out.println(sent + " bytes sent");
}
finally
{
    pipe.close();
}

这个example是从端点0x83读取8个字节:

UsbEndpoint endpoint = iface.getUsbEndpoint((byte) 0x83);
UsbPipe pipe = endpoint.getUsbPipe();
pipe.open();
try
{
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值