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