2013-09-23 61 views
3

我有一个USB设备(热敏打印机),我能够通过USBManager在Android中捕捉设备,我遇到的麻烦是了解controlTransfer方法。我有设备的仿真命令集参考说:使用controlTransfer与USB设备通讯

控制代码以十六进制或十进制表示法表示。

[X] 16十六进制表示法( '0' .. '9', 'A' .. 'F') [X] 10十进制计数法( '0' .. '9') [X] 2二进制表示法(“0” ..“1”)

一个在这里的方法是要求(从DOC)打印机状态:

请求打印机状态 该命令要求打印机的报告状态。 [1D] 16 + [61] 16 + [n]的

因此,这使我0x1d,0x61(如我可以在它们的C示例见):

BYTE aubEcPrinterDataRequest[] = {0x1d,0x61,0x00, 0x01}; 

参数[n]的确定哪个根据下面的图表,打印机发送状态数据包。这些数据包的确切内容是01,02 ..等等。

如何通过Android的controlTransfer发送此消息?

byte[] message = new byte[2]; 
     message[0] = 0x1d; 
     message[1] = 0x61; 
     // Send command via a control request on endpoint zero 
     mConnection.controlTransfer(UsbConstants.USB_DIR_IN, 0x00, 0x01, 0, message, message.length, 0); 

我也尝试各种其他的组合在这里如:

mConnection.controlTransfer(0x21, 34, 0x00, 0x01, message, message.length, 0); 
mConnection.controlTransfer(UsbConstants.USB_DIR_OUT, 0, 0, 0, message, message.length, 0); 

任何人都可以提供一些这方面的帮助,努力当我没有收到回信息?我已经通过以下页面看起来: http://www.beyondlogic.org/usbnutshell/usb6.shtml#SetupPacket

除了: http://www.usb.org/developers/devclass_docs/usbcdc11.pdf

虽然我不能似乎真的换我围绕着如何通过Android方法来发送这个头。

UPDATE 我已经得到这个使用bulkTransfer功能,而不是工作:

public void sendData(String str){ 
    final String character = str; 
    Log.d(TAG, "Sending..."); 

    if(character != null){ 
     Thread t = new Thread(new Runnable() { 
      @Override 
      public void run() { 
       byte[] array = new byte[]{27,100,100};//character.getBytes(); 
       Log.d("USB", "Sending Data..."); 
       int ret = mConnection.bulkTransfer(mEndpoint1, array, array.length, 100); 
       ByteBuffer output_buffer = ByteBuffer.allocate(array.length); 
       Log.d("USB", "Creating Buffer"); 
       UsbRequest req = new UsbRequest(); 
       req.setClientData("TEST\nTEST\nTEST"); 
       req.initialize(mConnection, mEndpoint1); 
       req.queue(output_buffer, array.length); 

       if(mConnection.requestWait() == req){ 
        Log.d("USB", output_buffer.getChar(0) + ""); 
        Message m = new Message(); 
        m.obj = output_buffer.array(); 
        //handler.sendMessage(m); 
        output_buffer.clear(); 
       } else{ 
        Log.d("USB", "No USBRequest received"); 
       } 
      } 
     }); 
     t.start(); 
    } 

} 

所以我可以成功地换行...等。我现在唯一的问题是如何发送数据以实际打印这种方式。

回答

0

所以我想这一点,所有通过使用bulkTransfer工作:

public void printData(String str){ 
    final String character = "-----------------\nCOMBO\n-----------------\nCOMBO\n-----------------\n\n-----------------\nSome more data...\n-----------------\nAnother Line\n-----------------\n"; 
    setCharSize(01); 
    startPage(50004); 
    if(character != null){ 
     Thread t = new Thread(new Runnable() { 
      @Override 
      public void run() { 
       byte[] array = character.getBytes(); 
       ByteBuffer output_buffer = ByteBuffer.allocate(array.length); 
       UsbRequest req = new UsbRequest(); 
       req.initialize(mConnection, ep); 
       req.queue(output_buffer, array.length); 
       if(mConnection.requestWait() == req){ 
        output_buffer.clear(); 
        endPage(); 
       } else{ 
        Log.d("USB", "No USBRequest received"); 
       } 
      } 
     }); 
     t.start(); 
    } 
} 

的setCharSize(01)和如上述发送不同byte []数组命令基于起始页()函数是相同的类似的功能在他们的文档/实施指南上。