博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
libusb-win32学习笔记(二)
阅读量:5024 次
发布时间:2019-06-12

本文共 2427 字,大约阅读时间需要 8 分钟。

       当完成配置工作后,就可以进行代码的编写(需要了解一些基本的USB协议的知识)。对于一个库的使用,其帮助文档是非常重要的,可以去找libusb-win32开发文档 (http://sourceforge.net/p/libusb-win32/wiki/Documentation/)。

  接下来分析一下使用bulk进行数据传输的代码。

  编写代码时,首先要确定IDVendorIDProduct,接着要确定bulk端点的输入输出的端口EP_IN和EP_OUT(PC端与USB设备是相反的):

 

#define IDVendor        0x1122#define IDProduct       0x3344#define EP_OUT          0x04#define EP_IN           0x83#define MY_CONFIG      0x01#define MY_INT          0x00#define BUFFER_SIZE     64

 

 

       接着是初始化,以及查找自己的设备:

 

 struct usb_bus *bus;

 struct usb_device *dev;
 struct usb_dev_handle *hdev;
 int ret = 0;
 char buffer2[BUFFER_SIZE] = "USBKEY by libusb-win32";

usb_init();usb_find_busses();usb_find_devices();for(bus = usb_get_busses(); bus; bus = bus->next){     for(dev = bus->devices; dev; dev = dev->next){          if(dev->descriptor.idVendor == IDVendor && dev->descriptor.idProduct == IDProduct){
          //......       }    } }

  通过idVendor和idProduct找到自己的设备之后就可以打开设备,得到一个设备的句柄hdev,通过该句柄就可以进行传输控制等操作了:

hdev = usb_open(dev);if(hdev == NULL){     printf("open error!\n");     return 1;}

  要进行数据的传输,必须先调用下面两个函数,进行配置和注册(可以查看帮助文档了解到):

if (usb_set_configuration(hdev, MY_CONFIG) < 0) {  printf("error setting config #%d: %s", MY_CONFIG, usb_strerror());  return 1;}if (usb_claim_interface(hdev, MY_INT) < 0) {  printf("error claiming interface #%d:\n%s", MY_INT, usb_strerror());  return 1;}

   其中MY_CONFIG和MY_INT分别由descriptor 中的 bConfigurationValue字段和 descriptor 中的bInterfaceNumber(关于这两个字段在USB协议中有介绍)。

      接着就可以使用函数进行bulk端点读写操作:

ret = usb_bulk_write(hdev,EP_OUT,buffer2,BUFFER_SIZE,1000);if(ret < 0){       printf("ret = %d\n",ret);       printf("write error: %s\n",usb_strerror()); }else{         printf("SED: %d\n",ret);       printf("SED: %s\n",buffer2); }ret = usb_bulk_read(hdev,EP_IN,buffer2,BUFFER_SIZE,1000);if(ret < 0){        printf("ret = %d\n",ret);        printf("read error: %s\n",usb_strerror());}else{        printf("REC: %d\n",ret);        printf("REC: %s\n",buffer2);}ret = usb_bulk_read(hdev,EP_IN,buffer2,BUFFER_SIZE,1000);if(ret < 0){         printf("ret = %d\n",ret);         printf("read error: %s\n",usb_strerror());}else{         printf("REC: %d\n",ret);         printf("REC: %s\n",buffer2); }

  读写结束后关闭设备:

usb_close(hdev);

  USB硬件设备的部分代码:

unsigned char buffer[BUFFER_SIZE];USB_Init();while(1){  USB_Bulk_Gets( buffer, 64 );  USB_Bulk_Puts( buffer, 64 );  USB_Bulk_Puts( "USBKEY IN A980", 64 );}

  程序运行结果:

        

 

转载于:https://www.cnblogs.com/alants/p/4454411.html

你可能感兴趣的文章
CentOS持久化二进制日志(systemd日志)
查看>>
SEO优化工具之三——Google百宝箱
查看>>
C# HttpClient 使用相关积累
查看>>
linux进程地址空间详解(转载)
查看>>
Python中ljust,rjust,center和zfill的用法解析
查看>>
打印机设置(PrintDialog)、页面设置(PageSetupDialog) 及 RDLC报表如何选择指定打印机...
查看>>
Java 虚拟机部分面试题
查看>>
JS中 String/JSON 方法总结
查看>>
二叉树的遍历问题总结
查看>>
3.14-3.20周总结
查看>>
Spring之面向切面编程AOP
查看>>
MATLAB GUI程序设计中使文本框接收多行输入的方法
查看>>
JdbcTemplate操作SQLServer存储过程
查看>>
easy canvas shape with react antdesign 简单的canvas图形in antd & react
查看>>
MySql中INFORMATION_SCHEMA
查看>>
【转】JAVA输出内容打印到TXT以及不同系统中如何换行
查看>>
tail -f 和 -F 的用法
查看>>
网络协议研究(四)FTP
查看>>
全文检索-Elasticsearch (四) elasticsearch.net 客户端
查看>>
Oracle DBMS_SESSION
查看>>