windows - C ++ Libusb bringer ikke tilbage serienummer af enheden

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg arbejder i øjeblikket på et projekt, der indebærer at bringe information tilbage fra enheder, der er plugget ind via ægte USB. For at løse dette forsøger jeg at bruge libusb i mit C ++-projekt. Jeg er på Windows 10, ved hjælp af C ++ og QT Creator med QT version 5.2.1. Jeg kan få leverandørens ID og produkt-id på min enhed med .idVendor og idProduct. Men mit serienummer vender tilbage som 0 med .iSerialNumber. Jeg sender min kode nedenfor og forhåbentlig kan nogen hjælpe mig med at finde ud af, hvad jeg mangler eller foreslår et andet bibliotek for mig at prøve. Tak!


bool CPumpFinder::pollTrueUSB(boolean &deviceFound, Device &newDevice)
{

boolean usbFound = FALSE;
boolean accuCheckFound = FALSE;
AccuGuideCom *acc = new AccuGuideCom();

libusb\_device **devs; //pointer to pointer of device, used to retrieve a list of devices
libusb\_context *ctx = NULL; //a libusb session
int r; //for return values
ssize\_t cnt; //holding number of devices in list
r = libusb\_init(&ctx); //initialize a library session

if(r < 0) {
    return 1;
}

libusb\_set\_debug(ctx, 3); //set verbosity level to 3, as suggested in the documentation
cnt = libusb\_get\_device\_list(ctx, &devs); //get the list of devices

if(cnt < 0) {

}

ssize\_t i; //for iterating through the list
for(i = 0; i < cnt; i++) {
      printdev(devs[i], usbFound, accuCheckFound); //print specs of this device
      if(usbFound == TRUE)
      {
          if(accuCheckFound == TRUE)
          {
              newDevice.displayName = "ACCU-CHEK GUIDE";
              newDevice.type = DEVICE\_ACCUCHECKGUIDE;
              newDevice.vendorID = accuVID;
              newDevice.productID = accuPID;
              newDevice.serial = accuSerial;

          }
          deviceFound = TRUE;
          break;
      }
}
libusb\_free\_device\_list(devs, 1); //free the list, unref the devices in it
libusb\_exit(ctx); //close the session

return deviceFound;

}

boolean CPumpFinder::printdev(libusb\_device *dev, boolean &usbFound, boolean 
&accuChekFound) {

libusb\_device\_descriptor desc;
int r = libusb\_get\_device\_descriptor(dev, &desc);

if (r < 0) {
    return usbFound;
}

uint16 vID = (uint16)desc.idVendor;
uint16 pID = (uint16)desc.idProduct; //desc.iSerialNumber

//#define ACCUCHEK\_GUIDE\_VENDORID                (uint16)0x173A
//#define ACCUCHEK\_GUIDE\_PRODUCTID               (uint16)0x21D5

if((vID == 5946) & (pID == 8661))
{
    accuPID = pID;
    accuVID = vID;

    //Do serial?
    accuSerial = "Test";

    write\_text\_to\_log\_file("we did it");
    accuChekFound = TRUE;

    usbFound = TRUE;
}

if(usbFound == TRUE)
{
    libusb\_config\_descriptor *config;
    libusb\_get\_config\_descriptor(dev, 0, &config);
    const libusb\_interface *inter;
    const libusb\_interface\_descriptor *interdesc;
    const libusb\_endpoint\_descriptor *epdesc;
    for(int i=0; i<(int)config->bNumInterfaces; i++) {
        inter = &config->interface[i];
        for(int j=0; j<inter->num\_altsetting; j++) {
            interdesc = &inter->altsetting[j];
            for(int k=0; k<(int)interdesc->bNumEndpoints; k++) {
                epdesc = &interdesc->endpoint[k];

                }
            }
        }

        libusb\_free\_config\_descriptor(config);
        if(accuChekFound == TRUE)
        {

            return accuChekFound;
        }
        return usbFound;
    }
    return usbFound;

}

Bedste reference