1

Androidのライブラリを使用してターミナルエミュレータに接続しようとしています。これによりシリアルデバイスに接続され、送受信されたデータが表示されます。inputStreamターミナルセッションに接続するには、 tosetTermIn(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);           
}

ただし、ByteArrayInputStreamは与えられたデータしか持つことができないため、データの送受信時に常に作成する必要があります。問題は、このデータを端末に表示したいのですが、データにbisを割り当てると、電話をかけたときのようにデータが添付されなくなります。mEmulatorView.attachSession(session);

ビスが端末に持っているバインドを壊すことなく、ビスが指しているものを更新する方法はありますか?

編集:また、アタッチを再度呼び出そうとするとエラーが発生しますが、理想的には再度呼び出したくないなどです。

 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 に答える