在linux ARM上使用libusb的状态热敏打印机

Status thermal printer with libusb on linux ARM

本文关键字:状态 打印机 libusb linux ARM      更新时间:2023-10-16

我知道关于状态打印机有很多问题。。。

我有一个Citizen CT-S310 II,我已经用libusb_bulk_transfer(Text、Bold、Center、CR、CUT_PAPER等)管理了USB中写入字符的所有代码:

#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);

现在,我需要从打印机接收数据来确认状态,我的第一个想法是用文档的相同"bulk_transfer"发送POS命令:

1D(六)72(六)nn=>1(发送纸张传感器状态)

并通过"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错误(read=-1中的"bulk_transfer")

也许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的doc不是很明确。

什么是"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_ttransfer"来请求我的打印机状态??

欢迎所有帮助我解决问题的人!!!

终于解决了!

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);