1

Android のライブラリを使用して端末エミュレータに接続しています。これはシリアル デバイス (スイッチ) に接続し、送受信されたデータを表示します。

ただし、バイト配列を何度も送信しているだけなので、スイッチのステータスがわかりません。これは、スイッチが有効になっているのか、設定モードなのかなどです。これにより、間違ったモードでコマンドを入力する可能性があり、それらは機能しません。 . 間違ったコマンドを送信したため、スイッチは回復不能モードになり、それを削除したり、新しい行に移動したりする方法がありません。今対処しようとしている問題は、スイッチのモードがわからないという問題です。コマンドを送信した後、3 つの異なるリターン プロンプトが表示される可能性があることはわかっています。

switch>
switch#
switch(config)#

だから、受信した最後の 2 文字を読めば、自分がどのモードにいるのかわかると思っていました。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

検索を最後から開始する方がパフォーマンスが高い場合は、取得するデータによって異なります。あなたがあなたの質問に投稿した小さな例ではこれを判断することはできません。

最後の2文字だけを見る必要がある場合:

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 に答える