簡體   English   中英

使用controlTransfer與USB設備通信

[英]Communicating with a USB device with controlTransfer

我有一個USB設備(熱敏打印機),我能夠通過USBManager在Android中捕獲設備,我遇到的問題是了解controlTransfer方法。 我有設備的仿真命令集參考,其中說:

控制代碼以十六進制或十進制表示法表示。

[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..etc。

如何通過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();
    }

}

所以我可以成功換線......等等。 我現在唯一的問題是如何將數據發送到實際以這種方式打印。

所以我認為這一切都在使用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 []數組命令的功能相同。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM