Я пытаюсь связаться со сканером отпечатков пальцев на базе 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