Libusb开发 (Libusb的基本使用)

小王子🤴 2020-08-18 21:11:17 9109
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个
内容存在敏感词
手气红包
    易百纳技术社区暂无数据
相关专栏
置顶时间设置
结束时间
删除原因
  • 广告/SPAM
  • 恶意灌水
  • 违规内容
  • 文不对题
  • 重复发帖
打赏作者
易百纳技术社区
小王子🤴
您的支持将鼓励我继续创作!
打赏金额:
¥1易百纳技术社区
¥5易百纳技术社区
¥10易百纳技术社区
¥50易百纳技术社区
¥100易百纳技术社区
支付方式:
微信支付
支付宝支付
易百纳技术社区微信支付
易百纳技术社区
打赏成功!

感谢您的打赏,如若您也想被打赏,可前往 发表专栏 哦~

举报反馈

举报类型

  • 内容涉黄/赌/毒
  • 内容侵权/抄袭
  • 政治相关
  • 涉嫌广告
  • 侮辱谩骂
  • 其他

详细说明

审核成功

发布时间设置
发布时间:
是否关联周任务-专栏模块

审核失败

失败原因
备注
拼手气红包 红包规则
祝福语
恭喜发财,大吉大利!
红包金额
红包最小金额不能低于5元
红包数量
红包数量范围10~50个
余额支付
当前余额:
可前往问答、专栏板块获取收益 去获取
取 消 确 定

小包子的红包

恭喜发财,大吉大利

已领取20/40,共1.6元 红包规则

    易百纳技术社区