Android のライブラリを使用して端末エミュレータに接続しています。これはシリアル デバイス (スイッチ) に接続し、送受信されたデータを表示します。別のライブラリを使用してシリアル経由でデータを送信します。どちらの場合も、ターミナルの下のテキスト ボックスを介して接続を介してデータを送信するか、ターミナル自体に入力してキーボードの Enter キーを押します。経由で送信すると、editText
すべて正常に動作します。データを送受信し、端末に表示します。
ただし、端末を選択して文字を入力すると、これらは画面に表示され、シリアル経由で送信されることなく、書き込みメソッドに直接送信されます。write メソッドからシリアル経由で送信すると、端末に 2 回表示されます。
私の活動では、sendOverSerial
シリアル経由でデータを送信するためにライブラリメソッドを呼び出すだけのメソッドがあります。データを送信すると、シリアル デバイスからデータが受信され、onDataReceieved
自動的に呼び出されます。
public static void sendOverSerial(byte[] data) {
if(mSelectedAdapter !=null && data !=null){
mSelectedAdapter.sendData(data);
}}
データ受信時に呼び出されるメソッド:
public void onDataReceived(int id, byte[] data) {
dataReceived = new String(data);
dataReceivedByte = data;
statusBool = true;
Log.d(TAG, "in data received " + dataReceived);
((MyBAIsWrapper) bis).renew(data);
runOnUiThread(new Runnable(){
@Override
public void run() {
//this line writes to the terminal
mSession.appendToEmulator(dataReceivedByte, 0, dataReceivedByte.length);
}});
viewHandler.post(updateView);
}
通常、editText とボタンを介してシリアル経由でデータを送信する場合は、アクティビティで sendOverSerial メソッドを呼び出します。しかし、端末自体に文字を書き込んでいると、それらは別のクラスの書き込みメソッドで取得されます。私の問題は、データが受信されたインスタンスからsendOverSerialメソッドを呼び出すと、キーを押したときに1回、データがシリアル経由で送信されてonDataReceivedが呼び出されたときに、画面に2回書き込まれることです。
2 番目のクラスの write メソッドは次のとおりです。
public void write(byte[] bytes, int offset, int count) {
//this line ends up calling onDataReceived which writes to the terminal again
//I need it to send the data over serial
GraphicsTerminalActivity.sendOverSerial(data);
if (isRunning()) {
//this line writes to the terminal
//I need this line for my editText data to be written to the screen
doLocalEcho(bytes);
}
return;
}
doLocalEcho:
private void doLocalEcho(byte[] data) {
String str = new String(data);
appendToEmulator(data, 0, data.length);
notifyUpdate();
}
端末に文字を入力すると、この文字がwrite
自動的に送信されます。ここでは、画面に書き込まれますがsuper.write(bytes, offset, count);
、nextGraphicsTerminalActivity.sendOverSerial(data);
が呼び出され、データがシリアル経由で送信され、シリアル デバイスからのエコーが誘導されます。つまりonDataReceived
、文字が再び画面に書き込まれます。
画面に 1 文字だけが表示されるようにコードを変更するにはどうすればよいですか? 移動 GraphicsTerminalActivity.sendOverSerial(bytes);
するonDataRecieved
と無限ループが発生するので、代わりにそこに入れることはできません。