發表於2015/6/23 21:55:11 4594人閱讀
最近在做關於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,里面的講解十分全