1

BluetoothChat のサンプル コードを変更して、TI MSP430 開発ボードの UART に接続した汎用の Bluetooth トランシーバーに接続しました。通信を確立し、単一の文字列を送受信して、値を TextView に表示できます。以下は、圧力、temp1、および temp 2 の 1 ~ 3 桁の値を送信するために使用している C コードです。これはかなり簡単で、設計どおりに動作しています。

  for(int i = 0; i <= 2; i++)     // send pressure value
  {
    UCA0TXBUF = pressureString[i];
    while(!(IFG2 & UCA0TXIFG));
  }
  for(int i = 0; i <= 2; i++)     // send temp1 value
  {
    UCA0TXBUF = tempOneString[i];
    while(!(IFG2 & UCA0TXIFG));
  }
  for(int i = 0; i <= 2; i++)     // send temp2 value
  {
    UCA0TXBUF = tempTwoString[i];
    while(!(IFG2 & UCA0TXIFG));
  }

今、複数のデータを Android デバイスに送信し、値ごとに個別の TextView にデータ型に従って表示したいと考えています。現在、2 つの温度センサーと 1 つの圧力センサーを測定しています。問題なくすべてのデータを Android デバイスに送信しましたが、すべての値が TextView で互いに上書きされ、最後に送信された文字列のみが表示されます。

これは、リモート デバイスに接続しているときに実行されるコードの一部です。

/**
 * This thread runs during a connection with a remote device.
 * It handles all incoming and outgoing transmissions.
 */
private class ConnectedThread extends Thread {
    private final BluetoothSocket mmSocket;
    private final InputStream mmInStream;
    private final OutputStream mmOutStream;

    public ConnectedThread(BluetoothSocket socket) {
        Log.d(TAG, "create ConnectedThread");
        mmSocket = socket;
        InputStream tmpIn = null;
        OutputStream tmpOut = null;

        // Get the BluetoothSocket input and output streams
        try {
            tmpIn = socket.getInputStream();
            tmpOut = socket.getOutputStream();
        } catch (IOException e) {
            Log.e(TAG, "temp sockets not created", e);
        }

        mmInStream = tmpIn;
        mmOutStream = tmpOut;
    }

    public void run() {
        Log.i(TAG, "BEGIN mConnectedThread");
        byte[] buffer = new byte[1024];
        int bytes;

        // Keep listening to the InputStream while connected
        while (true) {
            try {
                // Read from the InputStream
                bytes = mmInStream.read(buffer);

                // 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;
            }
        }
    }

これは、メッセージを読み取って TextView に表示するコードです。

case MESSAGE_READ:
                byte[] readBuf = (byte[]) msg.obj;
                // construct a string from the valid bytes in the buffer
                String readMessage = new String(readBuf, 0, msg.arg1);
                mTextView.setText(readMessage);                         //added by AMJ in attempt to display variable in textview
                break;

文字列の違いを区別できるようにAndroidアプリケーションをプログラムする方法がわからないようです。そのため、Temp1文字列を受信するとTemp1TextViewに移動し、Temp2文字列はTemp2TextViewに移動します。追加する必要がありますMSP430 から送信される最初のビットとして特殊文字を使用し、Android でそのビットを参照して、どこに行くべきかを識別しますか? ちょっとした考え。

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

編集: intを文字列に変換してから、トークナイザーを使用してそれを分離し、intに戻すことができると考えました。ただし、Bluetooth 経由でデータを受信すると、アプリケーションがクラッシュするようになりました。これが私がそれを変換するために使用しているコードです。なぜクラッシュするのか考えていますか?

bytes = mmInStream.read(buffer);

                byteString = String.valueOf(bytes);

                StringTokenizer tokens = new StringTokenizer(byteString, ":");
                String first = tokens.nextToken();      // this will contain exhaust temp
                String second = tokens.nextToken();     // this will contain damper position

                separatebytes1 = Integer.valueOf(first);
                    separatebytes2 = Integer.valueOf(second);

                // Read from the InputStream
              //  bytes = mmInStream.read(buffer);

                // Send the obtained bytes to the UI Activity
           //     mHandler.obtainMessage(BluetoothChat.MESSAGE_READ, bytes, -1, buffer)
           //             .sendToTarget();

                mHandler.obtainMessage(BluetoothChat.MESSAGE_READ, separatebytes1, -1, buffer)
                .sendToTarget();

これはクラッシュからの logcat です:

W/dalvikvm(24850): threadid=11: thread exiting with uncaught exception (group=0x
411ae300)
E/AndroidRuntime(24850): FATAL EXCEPTION: Thread-1286
E/AndroidRuntime(24850): java.util.NoSuchElementException
E/AndroidRuntime(24850):        at java.util.StringTokenizer.nextToken(StringTok
enizer.java:208)
E/AndroidRuntime(24850):        at com.example.android.BluetoothChat.BluetoothCh
atService$ConnectedThread.run(BluetoothChatService.java:411)
W/ActivityManager(  270):   Force finishing activity com.example.android.Bluetoo
thChat/.BluetoothChat
4

2 に答える 2

1

事前に定義された順序でいくつかの値を持つ単一のメッセージを持っているか、受信者 (アプリ) に次に送信される値を、多かれ少なかれ提案したように伝える必要があります。

于 2013-03-05T16:47:57.833 に答える
0

byteString に「:」が含まれていないために、(編集した質問に関して) クラッシュが発生する可能性があります。この場合、 String second = tokens.nextToken() 投稿した Fatal Exception を正確にスローします。

したがって、文字列を で区切る前に、バイト文字列tokens.nextToken()に含まれるトークンの数を次のように確認します。 tokens.countTokens

于 2013-03-11T09:51:20.063 に答える