首页 > 技术知识 > 正文

Libusb开发 (Libusb的基本使用)

上一篇文章简单的介绍了usb的基础知识,没有涉及到libusb的使用,本篇文章主要讲解libusb的使用。

Libusb是开源的跨平台的c库,源码及库文件可以在官网上下载下来: HYPERLINK “https://libusb.info。” https://libusb.info。

libusb初始化、释放

定义libusb上下文环境变量,此变量在很多地方都会用到

libusb_context *context = nullptr;

初始化libusb库,返回0则表示初始化成,否则失败

libusb_init(&context);

释放libusb库,参数是初始化时得到的libusb上下文环境

libusb_exit(context);

获取设备 //打印libusb库版本号,可不写 printf(“libusb Version:%d”,LIBUSB_API_VERSION) ; libusb_device ***devs= nullptr; int cnt = libusb_get_device_list(contex,devs); //返回负值则表示获取设备失败 if (cnt < 0) printf(“get device list fail”); libusb_device *dev; int i = 0, j = 0; uint8_t path[8]; while ((dev = devs[i++]) != NULL) { //设备描述符 struct libusb_device_descriptor desc; //获取设备描述符 libusb_get_device_descriptor(dev,&desc); //根据PID、VID筛选需要的设备,MY_VID、MY_PID是宏定义,根据自己需求定义 if((desc.idVendor == MY_VID && desc.idProduct == MY_PID)|| (desc.idVendor == MY_VID1 && desc.idProduct == MY_PID1) || (desc.idVendor == MY_VID2 && desc.idProduct == MY_PID2)) { //获取设备地址 uint8_t add = libusb_get_device_address(dev); } }
<
打开设备、关闭设备 int rc; //获取设备时获取的设备指针 libusb_device *usbDevice = dev; //设备句柄 libusb_device_handle* dHand = nullptr; //打开设备,获取设备句柄 rc = libusb_open(dev,&dHand); //返回值不为0,打开失败 if(rc != 0) { //打印错误代码 printf(“libusbOpen file:%d”,rc); return false; } //声明接口,声明要进行数据通讯的接口号,如果接口号声明错那么接下来的数据手法将都没用,这个地方我写的是0,因为我的通讯接口是0. rc = libusb_claim_interface(dHand,0); //返回值不为0,打开失败 if(rc != 0) { //打印错误代码 printf(“libusb_claim_interface file:%d”,rc); return false; } //速度代码查询设备支持的运行速度。 不做任何功能,这个地方知识打印出来查看一下,可不写 switch (libusb_get_device_speed(usbDevice)) { case LIBUSB_SPEED_LOW: printf(“LIBUSB_SPEED_LOW”); break; case LIBUSB_SPEED_FULL: printf(“LIBUSB_SPEED_FULL”); break; case LIBUSB_SPEED_HIGH: printf(“LIBUSB_SPEED_HIGH”); break; case LIBUSB_SPEED_SUPER: printf(“LIBUSB_SPEED_SUPER”); break; default: printf(“unknownSpeed”) ; break; }
<
数据接收、发送

以下介绍的数据收发是同步IO,异步IO下一章再详细介绍。

数据发送

int s = libusb_bulk_transfer(dHand,3,dat,len,nullptr,10); if(s < 0) { Printf(“writeError:%d”,s); }

数据接收

unsigned char* dat = new unsigned char[4096]; int len = 0; int rc = libusb_bulk_transfer(dHand,130,dat,4096,&len,10); if(rc == 0 || len != 0) { for(int i = 0;i < len;i++) { Printf(“data:%x”,dat[i]); } } delete [] dat; dat = nullptr;

根据上面接受与发送的片段代码可以看出接受与发送的接口相同,只是参数不同,因为libusb的读写接口是一个,根据端点号判断读写方向。上面代码中端点3是写数据,端点130是读数据。

以下是我对同步批量传输的接口理解:

libusb_bulk_transfer(libusb_device_handle *dev_handle, unsigned char endpoint, unsigned char *data, int length, int *actual_length, unsigned int timeout); dev_handle:设备句柄 Endpoint:端点 Data:数据地址,发送时是发送数据的地址,接受时是存放接受数据的地址 Length:数据长度,发送时是发送数据的长度,接受时是存放接受数据的地址的长度 actual_length:实际数据长度,发送数据长度或者接受到的数据长度 Timeout:超时时间 总结

关于libusb传输与几点一定要注意:

通讯的接口号 输入输出端点 驱动

以上三点有一个地方不对都会导致通讯失败,而且有可能不会提示任何错误。

猜你喜欢