2015-04-12 194 views
1

我知道有很多關於狀態的打印機問題...狀態熱敏打印機

我有一個西鐵城CT-S310 II,我設法寫字符的所有代碼在沒有USB問題libusb_bulk_transfer(文字,加粗,居中,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); 

現在,我需要從打印機接收數據ckeck的狀態,我的第一個想法是用相同的發送POS命令doc的「bulk_transfer」:

1D(hexa)72(hexa)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」in 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); 

我並不確切如何填補所有的參數,我知道這取決於我的設備,但DOC的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」的迴應是紙或without.How發好「control_transfer」的請求,我的打印機?

所有幫助的狀態始終爲0 :(解決我的問題是值得歡迎的!

回答

0

終於解決了!

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