我使用android中的库连接到终端模拟器,它连接到串行设备(交换机)并显示发送/接收的数据。我使用另一个库通过串行发送数据。我通过终端下方的文本框通过连接发送数据,或者通过键入终端本身并在两种情况下按键盘输入。当我通过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;
}
doLocalEcho:
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
,则会发生无限循环,因此我无法将其放在那里。