TecnoSuper.net

Informazioni sull'Italia. Seleziona gli argomenti di cui vuoi saperne di più

Come posso leggere e inviare dati usando libusb per C/C++?

Come posso leggere e inviare dati usando libusb per C/C++?

Come posso leggere e inviare dati usando libusb per C/C++?

Ho lavorato con libusb e finora sono stato in grado di leggere solo l’ID fornitore e l’ID prodotto. Inoltre, non puoi conoscere il nome del dispositivo USB, quindi qui devi controllare il nome del dispositivo USB: http://www.linux-usb.org/usb.ids

Ho questo lavoro.
Ma quando stavo per scrivere il codice per libusb quando stavo per leggere i dati da USB, ho notato che libusb non ha alcuna funzione per controllare quanti dati sono disponibili sulla porta USB.
A proposito, penso che libusb sia scritto male, libliotek sembra poco serio e gli esempi su github di libusb sono scritti da pistoni.

È così che ho risolto il problema della connessione e della lettura del nome del dispositivo USB. Più di questo non è uscito perché libusb è difficile da capire quali funzioni usare.

  1. comincio a chiamare initUSB() primo

  2. Quindi scarico i nomi USB getUSBPortNames(std::vector &portNames, std::vector &vendorIDs, std::vector e ID prodotto)

  3. Quindi, posso collegare la porta USB a openUSBConnection(uint16_t vendorID, uint16_t productID)

  4. Posso terminare la porta USB con chiudi Connessione USB()

Domande:

  1. Perché dovrei chiamare? libusb_set_auto_detach_kernel_driver() Dopo che ho chiamato libusb_bulk_transfer()?

  2. Perché dovrei chiamare? libusb_claim_interface() Dopo che ho chiamato libusb_set_auto_detach_kernel_driver()

  3. Come inviare dati con libusb e leggerli con libusb?

#define USB_IDS "Hardware/USB/usb.ids" libusb_context* ctx = nullptr; libusb_device_handle* device_handle = nullptr; uint16_t deviceVendorID; uint16_t deviceProductID; bool connectedToUSB = false; typedef struct { // Vendor uint16_t vendorID; std::string vendorName; // Product std::vector<uint16_t> deviceID; std::vector<std::string> deviceName; }USB_devices; std::vector<USB_devices*> devices; int initUSB() { // Init the USB int status = libusb_init(&ctx); // Load the descriptors std::string line; std::ifstream usbIds; usbIds.open(USB_IDS); if (!usbIds.is_open()) return -1; // Clear for (uint16_t i = 0; i < devices.size(); i++) { devices.at(i)->deviceName.clear(); devices.at(i)->deviceID.clear(); delete devices.at(i); } devices.clear(); // Create a struct USB_devices* usb = nullptr; uint16_t ID; std::string name; // Loop the whole list usb.ids while (getline(usbIds, line)) { // Check if the first number begins at '#' = 35 = 0x23 or just empty if (line.length() == 0) continue; if (line.at(0) == 0x23) continue; // Check if we reading a tab or just a number int shift = line.at(0) == '\t' ? 1 : 0; // Split, take first part and turn it to hex and string ID = stoi(line.substr(shift, line.find(" ")), 0, 16); name = line.substr(line.find(" ") + 1, line.length()); // +1 for reducing double space if (shift == 0) { // Create new usb = new USB_devices(); usb->vendorID = ID; usb->vendorName = name; devices.push_back(usb); } else { // If we have not generate an object first if (usb != nullptr) { usb->deviceID.push_back(ID); usb->deviceName.push_back(name); } } } usbIds.close(); } bool openUSBConnection(uint16_t vendorID, uint16_t productID) { device_handle = libusb_open_device_with_vid_pid(ctx, vendorID, productID); deviceVendorID = vendorID; deviceProductID = productID; connectedToUSB = device_handle != nullptr ? true : false; return isConnectedToUSB(); } bool closeUSBConnection() { if(isConnectedToUSB()) libusb_close(device_handle); connectedToUSB = false; return !isConnectedToUSB(); } bool isConnectedToUSB() { return connectedToUSB; } void getUSBPortNames(std::vector<std::string>& portNames, std::vector<uint16_t>& vendorIDs, std::vector<uint16_t>& productIDs) { // Get the names libusb_device** devs; int listOfDevices = libusb_get_device_list(ctx, &devs); for (int i = 0; i < listOfDevices; i++) { libusb_device* dev = devs[i]; struct libusb_device_descriptor desc; libusb_get_device_descriptor(dev, &desc); // Vendor and product ID uint16_t vendorID = desc.idVendor; uint16_t productID = desc.idProduct; // Save vendorIDs.push_back(vendorID); productIDs.push_back(productID); // Default names std::string vendorName = "Vendor:" + std::to_string(vendorID); std::string productName = " Product:" + std::to_string(productID); // With space, it looks better // Search for the device name for (uint16_t i = 0; i < devices.size(); i++) { // Find vendor ID if (devices.at(i)->vendorID != vendorID) continue; // Overwrite vendor name vendorName = devices.at(i)->vendorName; // Print the name std::vector<uint16_t> deviceID = devices.at(i)->deviceID; std::vector<std::string> deviceName = devices.at(i)->deviceName; for (uint16_t j = 0; j < deviceID.size(); j++) { if (deviceID.at(j) != productID) continue; // Overwrite product name productName = deviceName.at(j); break; } } // Combine product name and vendor name std::string portName = vendorName + productName; portNames.push_back(portName); } libusb_free_device_list(devs, 1); }

READ  Test: Marshall Emberton II - Kompakt uppföljare med stort ljud