libusb获取usb设备的idVendor(vid),idProduct(pid),以及Serial Number

      最近在做关于usb设备的项目,用到了libusb,发现关于这个的函数库的介绍,讲解很少,下面仅仅是简单展示一些基本的使用方法,以备后用。

本人的系统ubuntu,首先

sudo apt-get install libusb-dev
sudo apt-get install libusb-1.0-0-dev

安装libusb开发环境,这个函数库的函数基本上定义在libusb-1.0/libusb.h里,因此,使用时需要引用头文件#include <libusb-1.0/libusb.h>,另外,使用gcc编译时需要加上 `pkg-config --libs --cflags libusb-1.0`,例如

gcc findusb.c -o findusb `pkg-config --libs --cflags libusb-1.0`

下面给出两个函数,获取usb设备的idVendor(vid),idProduct(pid),以及Serial Number

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <libusb-1.0/libusb.h>

#define CHAR_MAX_LEN 256
#define BUF_MAX_LEN INT_MAX

struct usb_st{
	char sn[CHAR_MAX_LEN];
	char product[CHAR_MAX_LEN];
	uint16_t pid;
	uint16_t vid;
};

/*
return 0 means don't equal;return 1 means equal.
*/
int chk_serial_number(uint16_t pid,uint16_t vid,char *sn){
	//usb information index
	struct libusb_device_descriptor usb_info;
	//usb device
	struct libusb_device *usb_d=NULL;
	//the handle of the opened usb device
	struct libusb_device_handle *usb_p=NULL;
	//buffer
	char buf[CHAR_MAX_LEN]={0};

	usb_p=libusb_open_device_with_vid_pid(NULL,pid,vid);
	if(usb_p!=0){
		//find information index
		usb_d=libusb_get_device(usb_p);
		if(libusb_get_device_descriptor(usb_d,&usb_info)!=0){
			perror("can't find usb device's information");
			libusb_close(usb_p);
			return 0;
		}
		//find SerialNumber
		libusb_get_string_descriptor_ascii(usb_p,usb_info.iSerialNumber,buf,CHAR_MAX_LEN);
		return (strcmp(buf,sn)==0);
	}else{
		perror("can't find usb device");
		libusb_close(usb_p);
		return 0;
	}
	libusb_close(usb_p);
	return 1;
}

/*
fill the usb devices information list
*/
ssize_t ls_usb_device(struct usb_st *st){
	ssize_t usb_list_len=0,idx=0;
	struct libusb_device **list=NULL;
	struct libusb_device *dev=NULL;
	struct libusb_device_descriptor desc={0};
	struct libusb_device_handle *usb_p=NULL;
	char buf[CHAR_MAX_LEN]={0};

	//get the list
	usb_list_len=libusb_get_device_list(NULL,&list);
	if(usb_list_len==0){
		perror("can't find usb list");
		return 0;
	}
	//access the members of the list
	for(idx=0;idx!=usb_list_len;idx++){
		memset(&desc,sizeof(struct libusb_device_descriptor),0);
		if(libusb_get_device_descriptor(list[idx],&desc)!=0){
			perror("can't find usb list information");
			return 0;
		}
		//copy usb device's information to the st
		libusb_open(list[idx],&usb_p);
		libusb_get_string_descriptor_ascii(usb_p,desc.iProduct,st[idx].product,CHAR_MAX_LEN);
		libusb_get_string_descriptor_ascii(usb_p,desc.iSerialNumber,st[idx].sn,CHAR_MAX_LEN);
		st[idx].pid=desc.idProduct;
		st[idx].vid=desc.idVendor;
		libusb_close(usb_p);
	}
	//return the lenght of list
	return usb_list_len;
}

/*
initialization
*/
void t_init(){
	libusb_init(NULL);
}

/*
when app distory
*/
void t_exit(){
	libusb_exit(NULL);
}

main(){
	struct usb_st st[CHAR_MAX_LEN];
	ssize_t usb_list_len=0;
	int i=0;
	t_init();
	printf("%d",chk_serial_number(0x8829,0x0010,"9053053023054027"));
	usb_list_len=ls_usb_device(st);
	for (i = 0; i < usb_list_len; ++i)
	{
		printf("product:%s\nsn:%s\npid:%x\nvid:%x\n\n",st[i].product,st[i].sn,st[i].pid,st[i].vid);
	}
	t_exit();
}

     首先必须使用libusb_init()初始化,运行结束需要libusb_exit(),这两个函数,一个是chk_serial_number(),传入pid,vid,和序列号,功能是检测当前是否存在传入的pid,vid与序列号相等的usb设备,存在则返回1。

     而ls_usb_device将当前系统所有的usb设备信息(pid,vid,序列号)放到st数组里。

     欲了解更多函数功能请移步http://libusb.sourceforge.net/api-1.0/api.html,里面的讲解十分全

  • 2
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
对于libusb库,它是一个用于访问USB设备的跨平台库,通常用于在用户空间操作USB设备。在libusb中,无法直接获取USB设备的COM口,因为COM口是特定于操作系统的概念。 然而,你可以使用libusb获取USB设备VIDPID信息,以及设备的其他属性。以下是一个基本的示例代码,展示如何使用libusb获取USB设备VIDPID: ```c #include <stdio.h> #include <libusb-1.0/libusb.h> int main() { libusb_context *ctx = NULL; libusb_device **devs = NULL; libusb_device_handle *dev_handle = NULL; int r = 0; // 初始化libusb r = libusb_init(&ctx); if (r < 0) { printf("Failed to initialize libusb: %d\n", r); return 1; } // 获取USB设备列表 ssize_t count = libusb_get_device_list(ctx, &devs); if (count < 0) { printf("Failed to get device list: %zd\n", count); libusb_exit(ctx); return 1; } // 遍历设备列表 for (ssize_t i = 0; i < count; ++i) { libusb_device *dev = devs[i]; struct libusb_device_descriptor desc; // 获取设备描述符 r = libusb_get_device_descriptor(dev, &desc); if (r < 0) { printf("Failed to get device descriptor: %d\n", r); continue; } // 检查设备VIDPID if (desc.idVendor == YOUR_VENDOR_ID && desc.idProduct == YOUR_PRODUCT_ID) { // 在此处进行其他操作,如打开设备、进行数据传输等 printf("Found device with VID:PID = %04x:%04x\n", desc.idVendor, desc.idProduct); } } // 释放设备列表 libusb_free_device_list(devs, 1); // 关闭libusb libusb_exit(ctx); return 0; } ``` 以上代码示例中,你需要将`YOUR_VENDOR_ID`和`YOUR_PRODUCT_ID`替换为你所关注的USB设备的实际VIDPID。通过遍历设备列表,找到匹配的设备后,你可以在相应的位置执行你想要的操作。 请注意,此示例仅演示了如何使用libusb获取USB设备VIDPID信息,并不能直接获取COM口信息。要获取特定USB设备的COM口,可能需要结合操作系统特定的API或工具。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值