我有一个 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};
Run Code Online (Sandbox Code Playgroud)
参数 [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);
Run Code Online (Sandbox Code Playgroud)
我还在这里尝试了各种其他组合,例如:
mConnection.controlTransfer(0x21, 34, 0x00, 0x01, message, message.length, 0);
mConnection.controlTransfer(UsbConstants.USB_DIR_OUT, 0, 0, 0, message, message.length, 0);
Run Code Online (Sandbox Code Playgroud)
任何人都可以提供一些帮助吗?我浏览了以下页面: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();
}
}
Run Code Online (Sandbox Code Playgroud)
所以我可以成功换行...等。我现在唯一的问题是如何发送数据以这种方式实际打印。
所以我想通了,一切都通过使用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();
}
}
Run Code Online (Sandbox Code Playgroud)
setCharSize(01) 和 startPage() 函数与上面的函数相同,根据其文档/实现指南发送不同的 byte[] 数组命令。
| 归档时间: |
|
| 查看次数: |
4099 次 |
| 最近记录: |