Статусный термопринтер с libusb на linux ARM

Я знаю, что есть много вопросов о статусе принтера …

У меня есть Citizen CT-S310 II, я управлял всем кодом для записи символа в USB без проблем с libusb_bulk_transfer (Text, Bold, Center, CR, CUT_PAPER и т. д.):

#define ENDPOINT_OUT    0x02
#define ENDPOINT_IN     0x81

struct libusb_device_handle *_handle;

[detach kernel driver...]
[claim interface...]
[etc ...]

r = libusb_bulk_transfer(device_handle, ENDPOINT_OUT, Mydata, out_len, &transferred, 1000);

Теперь мне нужно получить данные с принтера, чтобы проверить статус, моя первая идея состояла в том, чтобы отправить команду POS с тем же «bulk_transfer» документа:

1D (гекса) 72 (гекса) n
n => 1 (отправить состояние датчика papel)

и извлеките значение с помощью «bulk_transfer» с конечной точкой «ENDPOINT_IN», в которой документ скажет, что есть 8 байтов для получения:

bit 0,1 => paper found by paper near-end sensor 00H
bit 0,1 => paper not found by paper near-end sensor 03H
bit 1,2 => paper found by paper-end sensor 00H
bit 1,2 => paper not found by paper-end sensor 0CH
[...]

так что два «bulk_transfer», один для статуса команды отправки (ENDPOINT_OUT) и один для получения результата (ENDPOINT_IN), но у меня всегда есть ошибка USB («bulk_transfer» в read = -1)

Может быть, USB не работает так? Поэтому моей второй идеей было использовать реализованную функцию в PrinterClass USB с командой «control_transfer»:

int r = 0;
int out_len = 1;
unsigned char* _udata = NULL;

uint8_t bmRequestType = LIBUSB_ENDPOINT_IN | LIBUSB_REQUEST_TYPE_CLASS | LIBUSB_RECIPIENT_INTERFACE;
uint8_t bRequest = LIBUSB_REQUEST_GET_STATUS;
uint16_t wValue = 0; // the value field for the setup packet (?????)
uint16_t wIndex = 0; // N° interface printer (the index field for the setup packet)

r = libusb_control_transfer(device_handle, bmRequestType,bRequest,wValue, wIndex,_udata,out_len, USB_TIMEOUT);

Я не совсем точно, как заполнить все параметры, я знаю, что это зависит от моего устройства, но документ libsub не очень явно.

Что такое «wValue»?

Что такое «wIndex»? номер интерфейса ??

параметр LIBUSB_ENDPOINT_IN по умолчанию равен 0x80, но мой принтер использует 0x81, я должен изменить эту конечную точку по умолчанию?

Bus 001 Device 004: ID 1d90:2060
Device Descriptor:
bLength                18
bDescriptorType         1
bcdUSB               2.00
bDeviceClass            0 (Defined at Interface level)
bDeviceSubClass         0
bDeviceProtocol         0
bMaxPacketSize0        64
idVendor           0x1d90
idProduct          0x2060
bcdDevice            0.02
iManufacturer           1 CITIZEN
iProduct                2 Thermal Printer
iSerial                 3 00000000
bNumConfigurations      1
Configuration Descriptor:
bLength                 9
bDescriptorType         2
wTotalLength           32
bNumInterfaces          1
bConfigurationValue     1
iConfiguration          0
bmAttributes         0xc0
Self Powered
MaxPower                0mA
Interface Descriptor:
bLength                 9
bDescriptorType         4
bInterfaceNumber        0
bAlternateSetting       0
bNumEndpoints           2
bInterfaceClass         7 Printer
bInterfaceSubClass      1 Printer
bInterfaceProtocol      2 Bidirectional
iInterface              0
Endpoint Descriptor:
bLength                 7
bDescriptorType         5
bEndpointAddress     0x81  EP 1 IN
bmAttributes            2
Transfer Type            Bulk
Synch Type               None
Usage Type               Data
wMaxPacketSize     0x0040  1x 64 bytes
bInterval               0
Endpoint Descriptor:
bLength                 7
bDescriptorType         5
bEndpointAddress     0x02  EP 2 OUT
bmAttributes            2
Transfer Type            Bulk
Synch Type               None
Usage Type               Data
wMaxPacketSize     0x0040  1x 64 bytes
bInterval               0
Device Status:     0x0001
Self Powered

Ответ «control_transfer» в моем случае всегда 0 🙁 с бумагой или без. Как отправить хороший «control_transfer» для запроса статуса моего принтера ??

Вся помощь для решения моей проблемы приветствуется !!!

1

Решение

наконец решено!

Значение LIBUSB_REQUEST_GET_STATUS равно 0x00, но для принтера статус запроса равен 0x01.

для проверки состояния принтера с libusb-1.0:

uint8_t bmRequestType = LIBUSB_ENDPOINT_IN | LIBUSB_REQUEST_TYPE_CLASS | LIBUSB_RECIPIENT_INTERFACE;
uint8_t bRequest = 0x01; // Here not LIBUSB_REQUEST_GET_STATUS
uint16_t wValue = 0;
uint16_t wIndex = 0;

r = libusb_control_transfer(device_handle, bmRequestType,bRequest,wValue, wIndex,&_udata,out_len, USB_TIMEOUT);
0

Другие решения


По вопросам рекламы [email protected]