16

SPPプロファイルを使用して、Bluetooth接続を使用してAndroidスマートフォンとAndroid以外のBluetoothモジュール間でデータを転送するAndroidアプリに取り組んでいます。Android Developer サイトの Bluetooth Chat Example を参照として使用しました。

2 つのデバイスを相互に接続し、スマートフォンから bluetooth モジュールに単純な文字列を送信することに成功しました。しかし、モジュールから返されたデータの読み取りでエラーが発生しました。Bluetooth チャットの例とまったく同じ次のコードを使用して、InputStream からデータを読み取りました。

while (true) {
    try {
        // Read from the InputStream
        bytes = mmInStream.read(buffer);
        String str = new String(buffer);
        Log.i(TAG, "mmInStream - " + str);
        // Send the obtained bytes to the UI Activity
        mHandler.obtainMessage(BluetoothChat.MESSAGE_READ, bytes, -1, buffer)
                .sendToTarget();
    } catch (IOException e) {
        Log.e(TAG, "disconnected", e);
        connectionLost();
        break;
    }
}

Bluetooth モジュールが電話に単純な文字列を送信すると、その文字列が正しく受信されません。ランダムな方法でいくつかの部分に分割されます。たとえば、「1234567890abcdef1234567890abcdef0123456789」を電話に 3 回送信すると、Eclipse の Logcat はこれらをログに記録します。

mmInstream - 12345678910abcdef��������(continuing null)
mmInstream - 1��������(continuing null)
mmInstream - 2345678910abcdef0123456789��������(continuing null)

初めて。2 回目と 3 回目のデータ送信では、異なる断片で受信されます。

mmInstream - 1234567891�������(continuing null)
mmInstream - 0abcdef012�������(continuing null)
mmInstream - 3456789���������(continuing null)

mmInstream - 1234567891����������������(continuing null)
mmInstream - 0abcdef0123456789������������(continuing null)

なぜこれが起こるのか、この問題を解決する方法はわかりません。このように任意の方法でデータを受信すると、処理に必要なデータを取得できません。ワンピースでどうやって手に入れるの?

どんな助けでも大歓迎です。

どうもありがとう。

4

9 に答える 9

15

あなたのコードで気づいた2つのこと:

  • まず、読み取り対象のバッファーへの参照をアプリにさらに送信することは、常に良い解決策とは限りません。その間にバッファーがオーバーライドされた場合はどうなりますか? たとえば、stackoverflow でこのバグを参照してください Bluetooth から読み取ったデータのコピーを作成することでこれを回避できます (たとえば、buffer.clone() を使用)。循環バッファを読み取ります。

  • データが別々のパケットで受信された場合でも、データを再コンパイルできるはずです (ただし、パケットは短時間で受信されます)。たとえば、開始/停止フラグを作成できます。Bluetooth経由で送信するオブジェクトのタイプによって異なります...

そして、前の 2 つの警告が役に立たない場合の可能な解決策は次のとおりです。

.read を呼び出す無限ループ (ブロッキング呼び出し) の代わりに、次のようなことができます。

while(true) {
     if mmInStream.getAvailable()>0 { 
          -your read code here-
     }
     else SystemClock.sleep(100);
}

これはハックであり、メッセージの一部しか読み取れないことがありますが、非常にまれです。

役立つ場合は、賛成票を投じてください/修正してください!

于 2012-09-06T10:40:03.053 に答える
0

見つけた!

バッファをリセットする必要があります:

buffer = new byte [1024];

この前に:

bytes = mmInStream.read(buffer); 

少なくともそれは私にとってはうまくいき、スリープコマンドは必要ありません.

于 2016-06-26T21:24:59.053 に答える