我正在尝试通过USB与基于GTM-5210F12的指纹扫描仪进行通信。操作系统是Debian9。为此,基于libusb编写了简单的代码。好像,WRITE操作没问题(因为usb_bulk_write返回正确的写入字节大小),但是当我尝试读取响应时-它始终为0,并且读取缓冲区为空。怎么了?
此扫描仪具有适用于Windows和Android的SDK,但不适用于Linux。某些搜索向我提供了一些信息,即Scanner Android SDK使用了基于很少修改的libusb版本的标准Android SDK功能。
#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