Bonjour,
Je m'initie actuellement à Qt Creator (Qt 5.10.1 et Qt Creator 4.5.1) et j'ai décidé de m'attaquer à la bibliothèque USB libusb 1.0.22.
Je suis sous Windows 7 64 bits mais je compile pour un environnement 32 bit avec MinGW 32 pour pouvoir éventuellement porter sur des PC plus anciens (XP) ou périphériques Android.
Donc comme je le disais dans le titre, j'ai assemblé quelques lignes de programme trouvées sur le net pour énumérer les périphériques connectés (donne le nombre), et qui donne :
- leur classe
- leur VID
- leur PID
- le nom du constructeur (quand il n'y a pas d'erreur lors de l'ouverture)
- le produit (quand il n'y a pas d'erreur lors de l'ouverture)
Mon premier petit exercice c'est d'accéder à une clé USB SanDisk Cruser Switch 4Go dont j'ai trouvé les ID dans le panneau de config (VID: 0781, PID: 5572).
Lorsque je lance mon programme, je retrouve bien le VID/PID de ma clé dans la liste, mais la classe est erronée (classe 0) ce qui provoque une erreur d'ouverture, donc pas d'accès aux infos Constructeur et Produit. De plus je retrouve bien ma souris, mon clavier et mon Pickit 3 (sonde de programmation microcontrôleur Microchip)
voici mon code main.cpp :
Voici ce qui en résulte :Code:#include "mainwindow.h" #include <QApplication> #include <iostream> #include <libusb.h> using namespace std; void printdev(libusb_device *dev) { struct libusb_device_handle *handle = NULL; libusb_device_descriptor desc; int r = libusb_get_device_descriptor(dev, &desc); if (r < 0) { cout << "Failed to get device descriptor" << endl; return; } cout << "Device Class: " << (int)desc.bDeviceClass << endl; cout << "VendorID: " << hex << desc.idVendor << endl; cout << "ProductID: " << hex << desc.idProduct << endl; // Open the device r = libusb_open(dev, &handle); if (r < 0) { printf("Error opening device\n"); return; } char str1[256]; // Get the iManufacturer to str1 r = libusb_get_string_descriptor_ascii(handle, desc.iManufacturer, (unsigned char*) str1, sizeof(str1)); if (r < 0) { printf("Manufacturer not found\n"); libusb_close(handle); return; } cout << "Manufacturer: " << str1 << endl; // Get the iProduct to str1 r = libusb_get_string_descriptor_ascii(handle, desc.iProduct, (unsigned char*) str1, sizeof(str1)); if (r < 0) { libusb_close(handle); return; } cout << "Product: " << str1 << endl; // Get the iSerial to str1 r = libusb_get_string_descriptor_ascii(handle, desc.iSerialNumber, (unsigned char*) str1, sizeof(str1)); if (r < 0) { libusb_close(handle); return; } cout << "Serial No: " << str1 << endl; libusb_close(handle); } int main(int argc, char *argv[]) { QApplication a(argc, argv); MainWindow w; libusb_device **devs; libusb_context *ctx = NULL; //a libusb context for library intialization int r = libusb_init(&ctx); //initializing the library if (r < 0) { cout << "Init Error " << r << endl; // There was an error return 1; } //libusb_set_option(ctx, LIBUSB_OPTION_LOG_LEVEL); int cnt = libusb_get_device_list(ctx, &devs); // Get the list of devices if (cnt < 0) { cout << "Get Device Error" << endl; // There was an error } cout << cnt << " devices in list." << endl; // Print total number of usb devices for (int i = 0; i < cnt; i++) { printdev(devs[i]); // Print specs of this device cout << "-----------------------" << endl; } libusb_free_device_list(devs, 1); // Free the list, unref the devices in it libusb_exit(ctx); // Close the session w.show(); return a.exec(); }
Est-ce que quelqu'un aurait une idée de quoi ça peut venir? Car si je ne me trompe pas une clé USB c'est du stockage de masse, donc classe 8 d'après USB.org. Est-ce que c'est le contrôleur USB du PC qui peut fausser les données? (Je ne peux tester que sur ce PC pour le moment)Code:9 devices in list. Device Class: 9 VendorID: 8086 ProductID: 8c26 Error opening device ----------------------- Device Class: 9 VendorID: 8086 ProductID: 8c2d Error opening device ----------------------- Device Class: 0 VendorID: 46d ProductID: c077 Manufacturer: Logitech Product: USB Optical Mouse ----------------------- Device Class: 0 VendorID: 4d8 ProductID: 900a Manufacturer: Microchip Technology Inc. Product: PICkit 3 Serial No: BUR142163887 ----------------------- Device Class: 0 VendorID: 781 ProductID: 5572 Error opening device ----------------------- Device Class: 0 VendorID: 413c ProductID: 2105 Manufacturer: Dell Product: Dell USB Keyboard ----------------------- Device Class: 9 VendorID: 8087 ProductID: 8000 Error opening device ----------------------- Device Class: 9 VendorID: 8087 ProductID: 8008 Error opening device ----------------------- Device Class: 9 VendorID: 8086 ProductID: 8c31 Error opening device -----------------------
Merci
-----