技术专栏
Libusb开发 (Libusb的基本使用)
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传输与几点一定要注意:
- 通讯的接口号
- 输入输出端点
- 驱动
以上三点有一个地方不对都会导致通讯失败,而且有可能不会提示任何错误。
声明:本文内容由易百纳平台入驻作者撰写,文章观点仅代表作者本人,不代表易百纳立场。如有内容侵权或者其他问题,请联系本站进行删除。
红包
点赞
收藏
评论
打赏
- 分享
- 举报
评论
0个
手气红包
暂无数据
相关专栏
-
浏览量:8654次2020-11-24 23:02:41
-
浏览量:7296次2020-08-14 23:09:45
-
浏览量:10483次2020-08-18 21:37:52
-
浏览量:15878次2020-12-02 22:54:46
-
浏览量:8053次2020-08-19 22:30:28
-
浏览量:4846次2020-08-19 22:25:39
-
浏览量:2627次2023-10-17 17:23:21
-
浏览量:3605次2020-08-18 15:39:19
-
浏览量:4928次2020-09-20 21:47:25
-
浏览量:6542次2020-08-10 19:44:10
-
浏览量:993次2023-09-07 18:43:08
-
浏览量:973次2024-01-17 11:25:11
-
浏览量:1978次2020-08-03 11:21:38
-
浏览量:34398次2021-06-28 08:13:24
-
浏览量:2043次2023-04-07 17:30:05
-
浏览量:4848次2021-09-30 15:04:23
-
浏览量:3551次2022-03-05 15:51:50
-
浏览量:1080次2023-12-26 16:33:04
-
浏览量:11046次2021-07-23 15:56:25
置顶时间设置
结束时间
删除原因
-
广告/SPAM
-
恶意灌水
-
违规内容
-
文不对题
-
重复发帖
打赏作者
小王子🤴
您的支持将鼓励我继续创作!
打赏金额:
¥1
¥5
¥10
¥50
¥100
支付方式:
微信支付
打赏成功!
感谢您的打赏,如若您也想被打赏,可前往 发表专栏 哦~
举报反馈
举报类型
- 内容涉黄/赌/毒
- 内容侵权/抄袭
- 政治相关
- 涉嫌广告
- 侮辱谩骂
- 其他
详细说明
审核成功
发布时间设置
发布时间:
请选择发布时间设置
是否关联周任务-专栏模块
审核失败
失败原因
请选择失败原因
备注
请输入备注