C ++ Libusb не возвращает серийный номер устройства - PullRequest
0 голосов
/ 09 мая 2018

В настоящее время я работаю над проектом, который предусматривает возвращение информации с устройств, подключенных через настоящий usb. Чтобы решить эту проблему, я пытаюсь использовать libusb в своем проекте C ++. Я на Windows 10, использую C ++ и QT Creator с версией QT 5.2.1. Я могу получить идентификатор поставщика и идентификатор продукта моего устройства с помощью .idVendor и idProduct. Тем не менее, мой серийный номер возвращается как 0 с .iSerialNumber. Я опубликую свой код ниже, и, надеюсь, кто-то может помочь мне выяснить, что мне не хватает, или предложить другую библиотеку для меня. Спасибо!

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;

}
...