使用controlTransfer与USB设备通信

5
我有一个USB设备(热敏打印机),我能够通过USBManager在Android中捕获该设备。但我现在遇到的问题是不理解controlTransfer方法。我有设备的仿真命令集参考文档,其中写着:

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

[X]16 十六进制表示(‘0’..’9’, ‘A’..’F’) [X]10 十进制表示(‘0’..’9’) [X]2 二进制表示(‘0’..’1’)

其中有一种方法是请求打印机状态(来自文档):

请求打印机状态 此命令要求打印机报告其状态。 [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方法发送它。 更新:我已使用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();
    }

}

我已经成功实现了换行等功能...等等。我的唯一问题是如何发送数据以按照这种方式进行打印。

1个回答

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)和startPage()函数与上面的类似函数相同,根据它们的文档/实现指南发送不同的byte[]数组命令。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接