1

我正在使用 android 中的库连接到终端仿真器,它连接到串行设备(开关)并向我显示发送/接收的数据。

但是我只是来回发送字节数组,所以我不知道交换机处于什么状态,是处于启用更多还是配置模式等。这导致我可能以错误的模式输入命令,它们将无法工作. 然后交换机处于不可恢复模式,因为我发送了错误的命令,无法删除它或进入新行。我现在要处理的问题是我不知道开关所处的模式。我知道在发送命令后可以有三种不同的返回提示:

switch>
switch#
switch(config)#

所以我在想,如果我阅读收到的最后两个字符,我就可以知道我处于哪种模式。h>、h# 和 )#

我用这种方法取回数据,只要收到数据,就会运行:

public void onDataReceived(int id, byte[] data) 
{

    String str = new String(data);
    ((MyBAIsWrapper) bis).renew(data);

    mSession.write(str);
    mSession.notifyUpdate();
    viewHandler.post(updateView);
}

最好的方法是以某种方式搜索字节数组或将其转换为字符串并在字符串中搜索 h>、h# 和 )#,然后我可以根据返回的值设置一个全局变量吗?也许从头向后搜索?

4

2 回答 2

4

我会搜索byte[]并避免转换为String.

如果从最后开始搜索性能更高,则取决于您获得的数据。我无法通过您在问题中发布的小例子来判断这一点。

如果只需要看最后两个字符:

if(data[data.length-2]=='h' && data[data.length-1]=='>') // "h>"


if(data[data.length-2]=='h' && data[data.length-1]=='#') // "h#"

或者如果不是那么简单,使用循环来迭代数组。

Ps 我假设上面的代码是 ASCII 编码

于 2013-01-09T13:21:00.303 回答
2

你的意思是?

if(str.endsWith("h>") || str.endsWith("h#") || str.endsWith(")#"))

或更简单

if(str.equals("switch>") || str.equals("switch#") || str.equals("switch(context)#"))

或使用正则表达式

final Pattern switched = Pattern.compile("switch(>|#|\\(\\w+\\)#)");

if(str.matcher(switched).matches())
于 2013-01-09T13:20:49.880 回答