zoukankan      html  css  js  c++  java
  • libusb-win32学习笔记(二)

           当完成配置工作后,就可以进行代码的编写(需要了解一些基本的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!
    ");
         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:
    %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
    ",ret);
           printf("write error: %s
    ",usb_strerror());
     }else{  
           printf("SED: %d
    ",ret);
           printf("SED: %s
    ",buffer2);
     }
    
    ret = usb_bulk_read(hdev,EP_IN,buffer2,BUFFER_SIZE,1000);
    if(ret < 0){
            printf("ret = %d
    ",ret);
            printf("read error: %s
    ",usb_strerror());
    }else{
            printf("REC: %d
    ",ret);
            printf("REC: %s
    ",buffer2);
    }
    
    ret = usb_bulk_read(hdev,EP_IN,buffer2,BUFFER_SIZE,1000);
    if(ret < 0){
             printf("ret = %d
    ",ret);
             printf("read error: %s
    ",usb_strerror());
    }else{
             printf("REC: %d
    ",ret);
             printf("REC: %s
    ",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 );
    }

      程序运行结果:

            

  • 相关阅读:
    div水平居中和垂直居中
    HTML流动布局各种宽度自适应
    PHP导出大量数据到excel表格
    等比例压缩图片到指定的KB大小
    SQLServer数据库中创建临时表
    Mysql数据库表关于几个int类型的字符长度
    JS 获取浏览器和屏幕宽高信息
    CTSC2018 & APIO2018 颓废 + 打铁记
    [UOJ#192]【UR #14】最强跳蚤
    ZJOI2018 Day2 滚粗记 + 流水账
  • 原文地址:https://www.cnblogs.com/alants/p/4454411.html
Copyright © 2011-2022 走看看