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!\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 );
}

  程序運行結果:

        

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM