0

我正在从 PIC(来自模拟输入)向蓝牙模块发送连续数据,然后我试图用 android 读取它们(在 HyperTerminal 中我得到从 0 到 255 的值)。如何更改我的代码以读取 3 个字节的字符串并立即将它们显示到 TextView 中。现在我可以显示数据,但它太慢了,并且只有在按下按钮时才会更新值。这是我的 MainActivity.java:

public class MainActivity extends Activity {
  private static final String TAG = "bluetooth2";

  Button btn1, btn2, btn3, btn4;
  TextView txtArduino;
  Handler h;

  private static final int REQUEST_ENABLE_BT = 1;
  final int RECIEVE_MESSAGE = 1;        // Status  for Handler
  private BluetoothAdapter btAdapter = null;
  private BluetoothSocket btSocket = null;
  private StringBuilder sb = new StringBuilder();

  private ConnectedThread mConnectedThread;

  // SPP UUID service
  private static final UUID MY_UUID = UUID.fromString("00001101-0000-1000-8000-00805F9B34FB");

  // MAC-address of Bluetooth module (you must edit this line)
  private static String address = "00:12:09:25:92:57";

  /** Called when the activity is first created. */
  @Override
  public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    setContentView(R.layout.activity_main);



btn1 = (Button) findViewById(R.id.btn1);                    // activity no. 1
btn2 = (Button) findViewById(R.id.btn2);                    // activity no. 2
btn3 = (Button) findViewById(R.id.btn3);                    // activity no. 3
btn4 = (Button) findViewById(R.id.btn4);                    // activity no. 4
txtArduino = (TextView) findViewById(R.id.txtArduino);      // for display the received data from the Arduino






h = new Handler() {
    public void handleMessage(android.os.Message msg) {

        switch (msg.what) {
        case RECIEVE_MESSAGE:
            byte[] readBuf = (byte[]) msg.obj;
            String strIncom = new String(readBuf, 0, msg.arg1);                     // create string from bytes array
            //Toast.makeText(MainActivity.this, strIncom, Toast.LENGTH_SHORT).show();
            sb.append(strIncom);                                                // append string
            int endOfLineIndex = sb.indexOf("\r\n");                            // determine the end-of-line
            if (endOfLineIndex > 0) {                                           // if end-of-line,
                String sbprint = sb.substring(0, endOfLineIndex);               // extract string
                sb.delete(0, sb.length());                                      // and clear
                txtArduino.setText("Data from PIC: " + sbprint);                // update TextView
                //btn2.setEnabled(true);
                //btn1.setEnabled(true); 
            }
            //Log.d(TAG, "...String:"+ sb.toString() +  "Byte:" + msg.arg1 + "...");
            break;
        }
    };
};


btAdapter = BluetoothAdapter.getDefaultAdapter();       // get Bluetooth adapter
checkBTState();

btn1.setOnClickListener(new OnClickListener() {
  public void onClick(View v) {
    //btn1.setEnabled(false);
    mConnectedThread.write("0");    // Send "0" via Bluetooth
    //Toast.makeText(getBaseContext(), "Turn on LED", Toast.LENGTH_SHORT).show(); 
    if(v.getId() == R.id.btn1){
    //define a new Intent for the second Activity
    Intent intent = new Intent(MainActivity.this,NewClass1.class);
    //start the second Activity
    MainActivity.this.startActivity(intent);
  }}
});

btn2.setOnClickListener(new OnClickListener() {
  public void onClick(View v) {
    //btn2.setEnabled(false);  
    mConnectedThread.write("1");    // Send "1" via Bluetooth
    if(v.getId() == R.id.btn2){
        //define a new Intent for the second Activity
        Intent intent = new Intent(MainActivity.this,NewClass2.class);
        //start the second Activity
        MainActivity.this.startActivity(intent);
  }}
});

btn3.setOnClickListener(new OnClickListener() {
    public void onClick(View v) {
    //btn3.setEnabled(false);  
    mConnectedThread.write("2");    // Send "2" via Bluetooth
    if(v.getId() == R.id.btn3){
        //define a new Intent for the second Activity
        Intent intent = new Intent(MainActivity.this,NewClass3.class);
        //start the second Activity
        MainActivity.this.startActivity(intent);
  }}
  });

btn4.setOnClickListener(new OnClickListener() {
    public void onClick(View v) {
    //btn4.setEnabled(false);  
    mConnectedThread.write("3");    // Send "3" via Bluetooth          
    if(v.getId() == R.id.btn4){
        //define a new Intent for the second Activity
        Intent intent = new Intent(MainActivity.this,NewClass4.class);
        //start the second Activity
        MainActivity.this.startActivity(intent);
  }}
  });
  }



  @Override
  public void onResume() {
super.onResume();

Log.d(TAG, "...onResume - try connect...");

// Set up a pointer to the remote node using it's address.
BluetoothDevice device = btAdapter.getRemoteDevice(address);

// Two things are needed to make a connection:
//   A MAC address, which we got above.
//   A Service ID or UUID.  In this case we are using the
//     UUID for SPP.
try {
  btSocket = device.createRfcommSocketToServiceRecord(MY_UUID);
} catch (IOException e) {
  errorExit("Fatal Error", "In onResume() and socket create failed: " + e.getMessage() + ".");
}

// Discovery is resource intensive.  Make sure it isn't going on
// when you attempt to connect and pass your message.
btAdapter.cancelDiscovery();

// Establish the connection.  This will block until it connects.
Log.d(TAG, "...Connecting...");
try {
  btSocket.connect();
  Log.d(TAG, "....Connection ok...");
} catch (IOException e) {
  try {
    btSocket.close();
  } catch (IOException e2) {
    errorExit("Fatal Error", "In onResume() and unable to close socket during connection failure" + e2.getMessage() + ".");
  }
}

// Create a data stream so we can talk to server.
Log.d(TAG, "...Create Socket...");

mConnectedThread = new ConnectedThread(btSocket);
mConnectedThread.start();
  }

  @Override
  public void onPause() {
    super.onPause();

Log.d(TAG, "...In onPause()...");

try     {
  btSocket.close();
} catch (IOException e2) {
  errorExit("Fatal Error", "In onPause() and failed to close socket." + e2.getMessage() + ".");
}
  }

  private void checkBTState() {
    // Check for Bluetooth support and then check to make sure it is turned on
    // Emulator doesn't support Bluetooth and will return null
    if(btAdapter==null) { 
      errorExit("Fatal Error", "Bluetooth not supported");
    } else {
      if (btAdapter.isEnabled()) {
        Log.d(TAG, "...Bluetooth ON...");
      } else {
        //Prompt user to turn on Bluetooth
        Intent enableBtIntent = new Intent(btAdapter.ACTION_REQUEST_ENABLE);
        startActivityForResult(enableBtIntent, REQUEST_ENABLE_BT);
        Toast.makeText(getBaseContext(), "Connected!", Toast.LENGTH_SHORT).show();
      }
    }
  }

  private void errorExit(String title, String message){
    Toast.makeText(getBaseContext(), title + " - " + message, Toast.LENGTH_LONG).show();
finish();
  }

  private class ConnectedThread extends Thread {
    private final BluetoothSocket mmSocket;
    private final InputStream mmInStream;
    private final OutputStream mmOutStream;

    public ConnectedThread(BluetoothSocket socket) {
        mmSocket = socket;
        InputStream tmpIn = null;
        OutputStream tmpOut = null;

        // Get the input and output streams, using temp objects because
        // member streams are final
        try {
            tmpIn = socket.getInputStream();
            tmpOut = socket.getOutputStream();
        } catch (IOException e) { }

        mmInStream = tmpIn;
        mmOutStream = tmpOut;
    }

    public void run() {
        byte[] buffer = new byte[256];  // buffer store for the stream
        int bytes; // bytes returned from read()

        // Keep listening to the InputStream until an exception occurs
        while (true) {
            try {
                // Read from the InputStream
                bytes = mmInStream.read(buffer);        // Get number of bytes and message in "buffer"
                h.obtainMessage(RECIEVE_MESSAGE, bytes, -1, buffer).sendToTarget();     // Send to message queue Handler
            } catch (IOException e) {

                break;
            }
        }
    }

    /* Call this from the main activity to send data to the remote device */
    public void write(String message) {
        Log.d(TAG, "...Data to send: " + message + "...");
        byte[] msgBuffer = message.getBytes();
        try {
            mmOutStream.write(msgBuffer);
        } catch (IOException e) {
            Log.d(TAG, "...Error data send: " + e.getMessage() + "...");     
          }
    }

    /* Call this from the main activity to shutdown the connection */
    public void cancel() {
        try {
            mmSocket.close();
        } catch (IOException e) { }
    }
}

}

和activity_main.xml:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:keepScreenOn="true" >


<TextView
    android:id="@+id/txtArduino"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignParentLeft="true"
    android:layout_alignParentTop="true"
    android:text="" />

<Button
    android:id="@+id/btn1"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_alignParentLeft="true"
    android:layout_below="@+id/txtArduino"
    android:text="@string/btn_1" />

<Button
    android:id="@+id/btn2"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_alignParentLeft="true"
    android:layout_below="@+id/btn1"
    android:text="@string/btn_2" />

<Button
    android:id="@+id/btn3"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_alignParentLeft="true"
    android:layout_below="@+id/btn2"
    android:text="@string/btn_3" />

<Button
    android:id="@+id/btn4"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_alignParentLeft="true"
    android:layout_below="@+id/btn3"
    android:text="@string/btn_4" />

</RelativeLayout>
4

1 回答 1

1

当我需要经常运行某些东西时,我会使用处理程序。

Handler viewHandler = new Handler();
Runnable updateView = new Runnable() {
        @Override
        public void run() {

                mEmulatorView.invalidate();
                viewHandler.postDelayed(updateView, 1000);


        }
    };

在我的方法中调用它:

viewHandler.post(updateView);

在这种情况下,我通过使其无效每 1000 毫秒更新一次屏幕。

编辑:完整的代码示例

Handler viewHandler = new Handler();
Runnable updateView = new Runnable() {
@Override

public void run() {

    mEmulatorView.invalidate();

    if (statusBool == true) {
        for (int i = 1; i < dataReceived.length() - 1; i++) {

            if (dataReceived.charAt(i) == '>') {

                Log.d(TAG, "found >");
                deviceStatus = 0;
            }
            if (dataReceived.charAt(i) == '#'
                    && dataReceived.charAt(i - 1) != ')') {

                Log.d(TAG, "found #");
                deviceStatus = 1;
            }
            if ((i + 1) <= (dataReceived.length())
                    && dataReceived.charAt(i) == ')'
                    && dataReceived.charAt(i + 1) == '#') {

                Log.d(TAG, "found config )#");
                deviceStatus = 2;
            }

        }
        statusBool = false;
        viewHandler.postDelayed(updateView, 1000);

    }
}
};


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

dataReceived = new String(data);

statusBool = true;
Log.d(TAG, "in data received " + dataReceived);
((MyBAIsWrapper) bis).renew(data);


runOnUiThread(new Runnable(){

    @Override
    public void run() {

        mSession.write(dataReceived);

    }});


viewHandler.post(updateView);



} 
于 2013-01-18T11:35:43.707 回答