我正在使用 android 中的库连接到终端仿真器,它连接到串行设备(开关)并显示发送/接收的数据。我使用另一个库通过串行发送数据。我通过终端下方的文本框或在终端本身输入并在两种情况下按键盘上的 Enter 键通过连接发送数据。当我通过editText
一切正常发送时。数据被发送和接收并显示在终端上。
但是,当我选择终端并键入字符时,这些字符会显示在屏幕上并直接发送到 write 方法,而不是通过串行发送。如果我通过 write 方法通过串行方式发送它们,它们会在终端上显示两次。
在我的活动中,我有一个名为的方法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 方法,它会两次写入屏幕,一次是当我按下键时,然后再次是当数据通过串行发送并调用 onDataReceived 时。
这是第二个类中的 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;
}
做本地回声:
private void doLocalEcho(byte[] data) {
String str = new String(data);
appendToEmulator(data, 0, data.length);
notifyUpdate();
}
我在终端上输入一个字符,这个字符是write
自动发送的。在这里它被写入屏幕,super.write(bytes, offset, count);
但接下来GraphicsTerminalActivity.sendOverSerial(data);
调用它通过串行发送数据并从串行设备引起回声,这意味着onDataReceived
将再次将字符写入屏幕。
如何更改代码以便屏幕上只显示一个字符?如果我移动 GraphicsTerminalActivity.sendOverSerial(bytes);
到onDataRecieved
一个无限循环发生,所以我不能把它放在那里。