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="<<ret;
#if USE_COUT
        std::cout << "error reading:%s\n" << usb_strerror() << std::endl;
#endif
        libusb_clear_halt(dev_handle,EP_IN);//调用该指令解决超时占用的问题
        return 1;
    }
    return 0;
}



///
// 以下是读写测试的一些函数
//
ret = libusb_bulk_transfer(dev_handle,0x02, (unsigned char *)&l_PrepareMeasData, pmsize,&transferred, 0);//发送命令	
printf("ret=%d  transferred=%d\r\n",ret,transferred);
if(ret==0 && transferred==pmsize)
    {            
    printf("write Successful!\n");    
    }  
else{           
    printf("write error!\n");      
    }     
ret = libusb_bulk_transfer(dev_handle, 0x86, rcvPreRcv, 6, &transferred, 0);//接收命令    
if (ret != 0) {          
    printf("failed to read \n");     
    }

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

  • 4
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 12
    评论
Linux使用libusb,你需要进行以下几个步骤: 1. 安装libusb库:使用包管理器安装libusb库,例如在Ubuntu上可以使用以下命令进行安装: ``` sudo apt-get install libusb-1.0-0-dev ``` 2. 编译链接使用libusb的程序:在编译你的程序时,需要将libusb库链接进去。可以使用以下命令编译一个简单的示例程序: ``` gcc -o your_program your_program.c -lusb-1.0 ``` 3. 编写代码:在你的代码中包含libusb的头文件,并使用libusb提供的函数进行设备的检测、打开、读写等操作。以下是一个简单的示例代码: ```c #include <stdio.h> #include <stdlib.h> #include <libusb-1.0/libusb.h> int main() { libusb_context *ctx = NULL; libusb_device_handle *dev_handle = NULL; // 初始化libusb库 if (libusb_init(&ctx) < 0) { printf("Failed to initialize libusb\n"); return -1; } // 打开指定的USB设备 dev_handle = libusb_open_device_with_vid_pid(ctx, vendor_id, product_id); if (dev_handle == NULL) { printf("Failed to open USB device\n"); libusb_exit(ctx); return -1; } // 在这里可以进行设备的读写操作 // 关闭设备和释放资源 libusb_close(dev_handle); libusb_exit(ctx); return 0; } ``` 请注意,上述示例代码中的`vendor_id`和`product_id`需要根据实际情况进行定义,以指定要打开的USB设备。 4. 运行程序:在终端中运行编译生成的可执行文件,即可使用libusb操作USB设备。 以上是在Linux使用libusb的基本步骤,你可以根据自己的需求进行进一步的开发和调试。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值