Debian libusb usb_bulk_read () не работает - PullRequest
0 голосов
/ 14 мая 2019

Я пытаюсь связаться со сканером отпечатков пальцев на базе GTM-5210F12 через USB.ОС Debian 9. Для этого был написан простой код на основе libusb.Похоже, операция WRITE в порядке (так как usb_bulk_write возвращает правильный размер записанных байтов), но когда я пытаюсь прочитать ответ - это всегда 0, а буфер чтения пуст.Что не так?

Этот сканер имеет SDK для Windows и Android, но не для Linux.Некоторые поиски дали мне информацию, что Scanner Android SDK использует стандартные функции Android SDK, основанные на немного измененной версии libusb.

#define VENDOR  0x2009
#define PRODUCT 0x7638
....
usb_init();
usb_find_busses();
usb_find_devices();
for (bus = usb_busses; bus; bus = bus->next) {
    for (dev = bus->devices; dev; dev = dev->next) {
        if ((dev->descriptor.idVendor == VENDOR)
                && (dev->descriptor.idProduct == PRODUCT)) {
            // calc params
            int endpointW =
                    dev->config->interface[0].altsetting[0].endpoint[1].bEndpointAddress;
            int endpointWPacketSize =
                    dev->config->interface[0].altsetting[0].endpoint[1].wMaxPacketSize;
            int endpointR =
                    dev->config->interface[0].altsetting[0].endpoint[0].bEndpointAddress;
            int endpointRPacketSize =
                    dev->config->interface[0].altsetting[0].endpoint[0].wMaxPacketSize;
            int interfaceId =
                    dev->config->interface[0].altsetting[0].bInterfaceNumber; // 0
            int configurationValue = dev->config->bConfigurationValue;

            // print params
            printf("Endpoint OUT number: %x", endpointW);
            printf("Endpoint OUT packet size: %i", endpointWPacketSize);
            printf("Endpoint IN number: %x", endpointR);
            printf("Endpoint IN packet size: %i", endpointRPacketSize);

            // try to open device
            usb_dev_handle* handler = usb_open(dev);
            if (handler != nullptr) {
                usb_detach_kernel_driver_np(handler, interfaceId);
                usb_set_configuration(handler, configurationValue);
            }

            // try to obtain interface
            usb_claim_interface(handler, interfaceId);

            // try to write data
            uint8_t wBuffer[endpointWPacketSize];
            memset(wBuffer, 0, sizeof(wBuffer));

            // start bytes
            wBuffer[0] = 0x55;
            wBuffer[1] = 0xaa;
            // device addr
            wBuffer[2] = 0x01;
            wBuffer[3] = 0x00;
            // param
            wBuffer[4] = 0x00;
            wBuffer[5] = 0x00;
            wBuffer[6] = 0x00;
            wBuffer[7] = 0x00;
            // command
            wBuffer[8] = 0x01;
            wBuffer[9] = 0x00;
            // checksum
            wBuffer[10] = 0x01;
            wBuffer[11] = 0x01;

            res = usb_bulk_write(handler, endpointW, (char*) wBuffer,
                    endpointWPacketSize, 200);
            printf("usb_bulk_write() %i", res);

            // try to read data
            uint8_t rBuffer[endpointRPacketSize];
            memset(rBuffer, 0, sizeof(rBuffer));
            res = usb_bulk_read(handler, endpointR, (char*) rBuffer,
                    endpointRPacketSize, 200);
            printf("usb_bulk_read() %i", res);

            // release interface
            usb_release_interface(handler, interfaceId);

            // close usb
            usb_close(handler);
        }
    }
}
...

консоль:

Endpoint OUT number: 2
Endpoint OUT packet size: 64
Endpoint IN number: 81
Endpoint IN packet size: 64
usb_bulk_write() success, 64 bytes written
usb_bulk_read() success, 0 bytes read
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
...