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传输与几点一定要注意:
通讯的接口号 输入输出端点 驱动以上三点有一个地方不对都会导致通讯失败,而且有可能不会提示任何错误。
免责声明:文章内容来自互联网,本站不对其真实性负责,也不承担任何法律责任,如有侵权等情况,请与本站联系删除。
转载请注明出处:Libusb开发 (Libusb的基本使用) https://www.yhzz.com.cn/a/15005.html