5

私は USB デバイス (サーマル プリンター) を持っています。USBManager を介して Android でデバイスをキャプチャできます。問題があるのは、controlTransfer メソッドを理解することです。デバイスのエミュレーション コマンド セット リファレンスがあります。

16 進数または 10 進数で表される制御コード。

[X]16 16 進表記 ('0'..'9', 'A'..'F') [X]10 10 進表記 ('0'..'9') [X]2 2 進表記 ('0') '..'1')

ここにある方法の 1 つは、(ドキュメントから) プリンターの状態を要求することです。

Request printer status このコマンドは、プリンターがそのステータスを報告するように要求します。[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();
    }

}

だから私はうまく改行することができます...など。私の唯一の質問は、実際にこの方法で印刷するためにデータを送信する方法です。

4

1 に答える 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[] 配列コマンドを送信する上記と同様の関数です。

于 2013-09-24T17:18:13.847 に答える