linux下使用libusb的示例,亲测有用

1、简要介绍

libusb是一个可以跨平台使用的usb设备驱动,能够发现连接上位机上所插入的usb设备。按道理说应该是可以驱动所有usb设备的。

2、安装步骤

1、在官网http://libusb.info/可以下载
2、下载好压缩包后导入到linux系统下,这里我使用的是ubuntu18.04版系统,libusb版本是用的libusb-1.0.22,解压后使用一下指令安装

./configure
make
make install

3、如果安装有错误,configure: error: udev support requested but libudev header not installed。则使用

./configure--build=x86_64-linux --disable-udev

然后再自行make等步骤
4、安装完成之后查看libusb的库和头文件所在的位置分别为

/usr/local/lib
/usr/local/include/libusb-1.0

3、调用过程

1、首先确保插入usb设备并连接上虚拟机,在虚拟机->可移动设备中查看是否连接上了usb设备。
2、查看usb设备的详细信息,使用以下指令查看设备的pid和vid,如果不知道自己插入的设备是哪一个,就先拔了usb使用以下指令,再插上后调用以下指令,看哪个是多出来的就知道了所使用的的设备是哪一个。

lsusb
lsusb -v

3、示例

主要分为初始化、找设备、连接设备、读空、读写测试等

static libusb_device_handle *dev_handle = NULL;unsigned char  find_dev()
{
    //初始化
    int ret;
    ret = libusb_init(NULL); 
    if(ret < 0) {
        fprintf(stderr, "failed to initialise libusb\n");
        return 1;   
    } 
    
    //打开指定pid和vid的设备
    dev_handle = libusb_open_device_with_vid_pid(NULL, 0x1992, 0x0668);
    if(dev_handle == NULL){
        perror("Cannot open device\n");
    }else{
        printf("Device Opened\n");
    }
    
    //内核驱动激活与分离(这一句我没怎么搞懂为啥需要,懂的朋友欢迎留言告诉我)
   if(libusb_kernel_driver_active(dev_handle, 0) == 1) { 
        printf("Kernel Driver Active\n");
        if(libusb_detach_kernel_driver(dev_handle, 0) == 0){
            printf("Kernel Driver Detached!\n");
        }
    }   
    
    //声明接口并读空
    ret = libusb_claim_interface(dev_handle, 0);
    if(ret < 0) {
        printf("Cannot Claim Interface\n");
        return 1;
    }else{
        qDebug()<<"claim interface success!";
        int size = SIZE_USB_BUF_CLEAN;//这是一个宏定义 #define SIZE_USB_BUF_CLEAN (1024*2)
        char data[SIZE_USB_BUF_CLEAN] = "";
        int val = 0;
        while (val == 0)   // 这里会一直读空,引起超时;
        {
            size = SIZE_USB_BUF_CLEAN;
            val = USBRead(data, size);
        }
        qDebug()<<"after clean";
        val = USBReadConfigureData();
        isUSBConnect = val == AIMOOE_OK;
        return val;
    }
}   

USBRead(char *recdata, int maxlen)
{
    int transferred;
    if (!dev_handle)
    {
        qDebug()<<"USB not open";
        return 1;
    }
    unsigned char *urecdata=(unsigned char*)recdata;
    int ret;
    ret=libusb_bulk_transfer(dev_handle,EP_IN,urecdata,maxlen,&transferred,500);
    if(ret<0){
        qDebug()<<"bulk read error,and ret="<

参考博客:https://www.cnblogs.com/sankye/p/13914909.html

你可能感兴趣的:(linux,c语言,qt,usb)