我讨厌回答我自己的问题,但是......我弄清楚了。我只是混淆了我的读写。此外,该设备不喜欢我在命令结束时使用的'\ n'。它似乎与'\ r'相处得更好。
我最终使用android的bulkTransfer进行读写。我的写作看起来像这样。
try { device.getWriter().write(command + "\r"); device.getWriter().flush(); } catch (IOException e) { throw new RuntimeException(e); }
我为我的BufferedWriter重写了写入方法:
@覆盖
public void write(char[] buf, int offset, int count) throws IOException { byte[] buffer = new String(buf, offset, count).getBytes(Charset.forName("US-ASCII")); int byteCount = connection.bulkTransfer(endpoint, buffer, buffer.length, TIMEOUT); }
读取类似:
char[] buffer = new char[BUF_SIZE]; try { BufferedReader reader = device.getReader(); int readBytes = reader.read(buffer); Log.d(TAG, "BYTES READ: " + readBytes); } catch (IOException e) { throw new RuntimeException(e); } String strBuf = new String(buffer).trim(); if (DEBUG) { Log.d(TAG, "Read: " + strBuf); }
和:
@Override public int read(char[] buf, int offset, int count) throws IOException { byte[] buffer = new byte[count]; int byteCount = connection.bulkTransfer(endpoint, buffer, buffer.length, TIMEOUT); if (byteCount < 0) { throw new IOException(); } char[] charBuffer = new String(buffer, Charset.forName("US-ASCII")).toCharArray(); System.arraycopy(charBuffer, 0, buf, offset, byteCount); return byteCount; }
这一切都只是在这样一个线程中开始:
new Thread() { @Override public void run() { String command = "go"; write(command); while (true) { String coords = read(); } } }.start();
显然这只是comm的东西,我现在需要用它做一些事情(把它放在一个可以使用处理程序报告回顶层UI活动的服务中)。但是这一部分已经弄明白了。
非常感谢那些正在研究rosjava的人们( http://code.google.com/p/rosjava/ )...他们组合了很多很棒的项目,他们的代码非常有用。
添加我的设备类以帮助澄清事情。
import com.google.common.base.Preconditions; import android.hardware.usb.UsbConstants; import android.hardware.usb.UsbDeviceConnection; import android.hardware.usb.UsbEndpoint; import android.hardware.usb.UsbInterface; import android.util.Log; import java.io.BufferedReader; import java.io.BufferedWriter; /* This class represents a USB device that supports the adb protocol. */ public class BKDevice { // private static final int TIMEOUT = 3000; private final UsbDeviceConnection usbDeviceConnection; private final BufferedReader reader; private final BufferedWriter writer; public static final String TAG = "AcmDevice"; public BKDevice(UsbDeviceConnection usbDeviceConnection, UsbInterface usbInterface) { Preconditions.checkState(usbDeviceConnection.claimInterface( usbInterface, true)); this.usbDeviceConnection = usbDeviceConnection; UsbEndpoint epOut = null; UsbEndpoint epIn = null; // look for our bulk endpoints for (int i = 0; i < usbInterface.getEndpointCount(); i++) { UsbEndpoint ep = usbInterface.getEndpoint(i); Log.d(TAG, "EP " + i + ": " + ep.getType()); if (ep.getType() == UsbConstants.USB_ENDPOINT_XFER_BULK) { if (ep.getDirection() == UsbConstants.USB_DIR_OUT) { epOut = ep; } else if (ep.getDirection() == UsbConstants.USB_DIR_IN) { epIn = ep; } } } if (epOut == null || epIn == null) { throw new IllegalArgumentException("Not all endpoints found."); } BKReader acmReader = new BKReader(usbDeviceConnection, epIn); BKWriter acmWriter = new BKWriter(usbDeviceConnection, epOut); reader = new BufferedReader(acmReader); writer = new BufferedWriter(acmWriter); } public BufferedReader getReader() { return reader; } public BufferedWriter getWriter() { return writer; } }
添加BKReader代码:
import android.hardware.usb.UsbDeviceConnection; import android.hardware.usb.UsbEndpoint; import android.util.Log; import java.io.IOException; import java.io.Reader; import java.nio.charset.Charset; public class BKReader extends Reader { private static final int TIMEOUT = 1000; private final UsbDeviceConnection connection; private final UsbEndpoint endpoint; public BKReader(UsbDeviceConnection connection, UsbEndpoint endpoint) { this.connection = connection; this.endpoint = endpoint; } @Override public int read(char[] buf, int offset, int count) throws IOException { byte[] buffer = new byte[count]; int byteCount = connection.bulkTransfer(endpoint, buffer, buffer.length, TIMEOUT); if (byteCount < 0) { throw new IOException(); } char[] charBuffer = new String(buffer, Charset.forName("US-ASCII")).toCharArray(); System.arraycopy(charBuffer, 0, buf, offset, byteCount); return byteCount; } @Override public void close() throws IOException { } }