Как исправить ошибку «LIBUSB_ERROR_NOT_FOUND» при вызове libusb_bulk_transfer - PullRequest
0 голосов
/ 24 июня 2019

Я создаю программу, которая читает входные данные с контроллера midi, используя libusb.Как правильно вызвать libusb_bulk_transfer?В настоящее время я каждый раз получаю сообщение об ошибке «LIBUSB_ERROR_NOT_FOUND», и я получаю данные «P».

Я поменял функцию 'libusb_bulk_transfer' на 'libusb_interrupt_transfer', но я все еще получаю то же самоеошибка: LIBUSB_ERROR_NOT_FOUND

Ниже приведены библиотеки, которые я в настоящее время включил

#include <stdlib.h>
#include <stdio.h>
#include <libusb-1.0/libusb.h>

Ниже приведена основная функция, которая находит все USB-устройства и вызывает функцию, которая вызывает у меня проблемы: printDeviceUsbInput (устройства [I]);Насколько я знаю, основная функция работает нормально.Я удалил проверку ошибок, чтобы сделать код короче

int main(int argc, char *argv[])
{
    libusb_device **devices;
    libusb_context *context = NULL;

    size_t list;
    size_t i;
    int returnValue;

    returnValue = libusb_init(&context);

    list = libusb_get_device_list(context, &devices);

    printf("There are %zu devices found \n\n", list);
    for (i = 0; i < list; i++)
    {
        printDeviceUsbInput(devices[i]);
        //printDevices(devices[i]);
    }

    libusb_free_device_list(devices, 1);
    libusb_exit(context);
    return 0;
}

Ниже приведена функция, которая находит устройство миди-клавиатуры и пытается распечатать ввод миди.Ака функция, которая вызывает у меня проблемы.Я был вдохновлен этим кодом: http://libusb.sourceforge.net/api-1.0/libusb_io.html

Я также удалил проверку ошибок, чтобы сделать функцию короче.

void printDeviceUsbInput(libusb_device *device)
{

    struct libusb_device_descriptor deviceDescriptor;

    int returnValue;

    returnValue = libusb_get_device_descriptor(device, &deviceDescriptor);

    if(deviceDescriptor.idProduct == 49)
    {
        printf("Keyboard found\n\n");
        unsigned char data[4];
        int actual_length;
        libusb_device_handle *deviceHandle;
        returnValue = libusb_open(device, &deviceHandle);

        while(1)
        {
            returnValue = libusb_bulk_transfer(deviceHandle, LIBUSB_ENDPOINT_IN,data, sizeof(data), &actual_length, 0);
            printf("Data: %s\n\n", data);
            printf("returnValue: %s\n\n", libusb_error_name(returnValue));
        }
    }
}

Я ожидаю, что вызов libusb_bulk_transfer вернет 0, и этозначение переменных данных будет меняться каждый раз, когда я нажимаю клавишу на миди-клавиатуре.

1 Ответ

0 голосов
/ 29 июня 2019

Я думаю, вам нужно отсоединить любой драйвер ядра и затем запросить интерфейс.

if(libusb_kernel_driver_active(handle, 0) == 1)
{
    printf("\nKernel Driver Active");
    if(libusb_detach_kernel_driver(handle, 0) == 0)
        printf("\nKernel Driver Detached!");
    else
    {
        printf("\nCouldn't detach kernel driver!\n");
        libusb_free_device_list(devs, 1);
        libusb_close(handle);
        return -1;
    }
}

returnValue = libusb_claim_interface(handle, 0);
if(returnValue < 0)
{
    printf("\nCannot Claim Interface");
    libusb_free_device_list(devs, 1);
    libusb_close(handle);
    return -1;
}
else
    printf("\nClaimed Interface\n");

Я борюсь с той же ошибкой, поэтому нахожу ваш вопрос, но моя проблема, похоже, связана с тем, что я не могу запросить интерфейс в OS-X Mojave

...