1

我正在尝试使用 android 中的库连接到终端仿真器,这将连接到串行设备并应该向我显示发送/接收的数据。要附加到终端会话,我需要提供inputStreamtosetTermIn(InputStream)outputStreamto 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);

我现在想在发送和接收数据时将流分配给数据。在每次按 Enter 时调用的 sendData() 方法中,我有:

public void sendData(byte[] data)
{
        bos = new ByteArrayOutputStream(data.length);         
}

在 onReceiveData() 方法中,每次通过串行接收数据时调用:

public void onDataReceived(int id, byte[] data)
{
        bis = new ByteArrayInputStream(data);           
}

但是,aByteArrayInputStream只能拥有给它的数据,因此在发送和接收数据时需要不断地创建它。现在的问题是,我希望这些数据出现在终端上,但是当我将 bis 分配给数据时,它不再像我打电话时那样附加mEmulatorView.attachSession(session);

有没有办法在不破坏 bis 对终端的绑定的情况下更新 bis 指向的内容?

编辑:另外,如果我尝试再次调用附加,我会收到错误,尽管理想情况下我不想再次调用它等等。

 SerialTerminalActivity.this.runOnUiThread(new Runnable() {
            public void run() {

                mSession.setTermIn(bis);
                mSession.setTermOut(bos);
                mEmulatorView.attachSession(mSession);
            }
          });

虽然那可能是我在那里的编码。 http://i.imgur.com/de8D5.png

4

1 回答 1

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);
}
于 2012-12-17T11:18:16.080 回答