我正在使用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#和)#,然后根据返回的值设置全局变量?也许可以从最后向后搜索?
发布于 2013-01-09 13:21:00
我将搜索byte[]
并避免转换为String
的开销。
如果从最后开始搜索会更有效率,这取决于您获得的数据。我不能通过你在问题中张贴的小例子来判断这一点。
如果您只需要查看最后两个字符:
if(data[data.length-2]=='h' && data[data.length-1]=='>') // "h>"
if(data[data.length-2]=='h' && data[data.length-1]=='#') // "h#"
或者,如果不是那么简单,使用循环来迭代数组。
附注:我假设上面的代码采用ASCII编码
发布于 2013-01-09 13:20:50
你的意思是?
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())
https://stackoverflow.com/questions/14236029
复制相似问题