我正在尝试使用android中的库连接到终端模拟器,这将连接到串行设备,并应显示发送/接收的数据。要附加到终端会话,我需要提供inputStream
到setTermIn(InputStream)
和outputStream
到setTermOut(OutputStream)
。
我在onCreate()
初始化并附加了一些像这样的流,这些只是初始流,并没有附加到我想要发送/接收的数据上。
private OutputStream bos;
private InputStream bis;
...
byte[] a = new byte[4096];
bis = new ByteArrayInputStream(a);
bos = new ByteArrayOutputStream();
session.setTermIn(bis);
session.setTermOut(bos);
/* Attach the TermSession to the EmulatorView. */
mEmulatorView.attachSession(session);
我现在想在发送和接收数据时将数据流分配给数据。在sendData()方法中,每次按下回车都会调用,我有:
public void sendData(byte[] data)
{
bos = new ByteArrayOutputStream(data.length);
}
并在onReceiveData()方法中,每次通过串行接收数据时调用:
public void onDataReceived(int id, byte[] data)
{
bis = new ByteArrayInputStream(data);
}
但是ByteArrayInputStream
只能获得给它的数据,所以在发送和接收数据时需要不断创建。{1}}。现在的问题是,我希望这些数据出现在终端上,但是当我为数据分配bis时,它不再像我调用mEmulatorView.attachSession(session);
有没有办法更新bis指向的内容而不破坏bis对终端的绑定?
编辑: 此外,如果我再次尝试调用attach,我会收到错误,尽管理想情况下我不想再次调用它等。
SerialTerminalActivity.this.runOnUiThread(new Runnable() {
public void run() {
mSession.setTermIn(bis);
mSession.setTermOut(bos);
mEmulatorView.attachSession(mSession);
}
});
虽然那可能是我的编码。 http://i.imgur.com/de8D5.png
答案 0 :(得分:1)
包装ByteArrayInputStream,添加你需要的功能。
举个例子:
public class MyBAIsWrapper implements InputStream {
private ByteArrayInputStream wrapped;
public MyBAIsWrapper(byte[] data) {
wrapped=new ByteArrayInputStream(data);
}
//added method to refresh with new data
public void renew(byte[] newData) {
wrapped=new ByteArrayInpurStream(newData);
}
//implement the InputStreamMethods calling the corresponding methos on wrapped
public int read() throws IOException {
return wrapped.read();
}
public int read(byte[] b) throws IOException {
return wrapped.read(b);
}
//and so on
}
然后,更改初始化代码:
byte[] a = new byte[4096];
bis = new MyBAIsWrapper(a);
session.setTermIn(bis);
//here, you could do somethin similar for OoutpuStream if needed, or keep the same initialization...
bos = new ByteArrayOutputStream();
session.setTermOut(bos);
/* Attach the TermSession to the EmulatorView. */
mEmulatorView.attachSession(session);
并更改onDataReceived方法以更新输入流数据:
public void onDataReceived(int id, byte[] data)
{
//cast added to keep original code structure
//I recomend define the bis attribute as the MyBAIsWrapper type in this case
((MyBAIsWrapper)bis).renew(data);
}