从 arduino 接收 android 并显示图表

receiving android from arduino and display graph

您好,我的问题是当我 运行 我的应用程序崩溃时。并且发现下面有错误。 这是我下面的代码列表

蓝牙代码看起来像这样

package com.example.tut;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.Set;
import java.util.UUID;
import android.app.Activity;
import android.bluetooth.BluetoothAdapter;
import android.bluetooth.BluetoothDevice;
import android.bluetooth.BluetoothSocket;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.Bundle;
import android.os.Handler;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.Toast;
public class bluetooth extends Activity implements OnItemClickListener {
 public static void disconnect(){
    if (connectedThread != null){
        connectedThread.cancel();
        connectedThread = null;
}
}
    public static void gethandler(Handler handler){
    mHandler = handler;
}
static Handler mHandler = new Handler();
static ConnectedThread connectedThread;
public static final UUID MY_UUID    
UUID.fromString("00001101-0000-1000-8000-00805F9834FB");
protected static final int SUCCESS_CONNECT=0;
protected static final int MESSAGE_READ = 1;

ListView listview;
ArrayAdapter<String> listAdapter;
static BluetoothAdapter btAdapter;
Set<BluetoothDevice> devicesArray;
ArrayList<String> pairedDevices;
ArrayList<BluetoothDevice> devices;
IntentFilter filter;
BroadcastReceiver receiver;

@Override
protected void onCreate(Bundle savedInstanceState) {
    // TODO Auto-generated method stub
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_bluetooth);
    init();
    if (btAdapter==null){
        Toast.makeText(getApplicationContext(), "No BT detected", 
    0).show();
        finish();
    }else{
        if(!btAdapter.isEnabled()){
            turnOnBT();
        }
        getPairedDevices();
        startDiscovery();
            }   
        }
   private void getPairedDevices(){
    btAdapter.cancelDiscovery();
    btAdapter.startDiscovery();
    }
    private void    turnOnBT(){
    Intent intent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
    startActivityForResult(intent, 1);
    }
    private void startDiscovery(){
    devicesArray = btAdapter.getBondedDevices();
    if(devicesArray.size()>0){
    for(BluetoothDevice device:devicesArray){
        pairedDevices.add(device.getName());    
       }
       }
       }
private void init(){
listview = (ListView)findViewById(R.id.ListView);
listview.setOnItemClickListener(this);
listAdapter = new ArrayAdapter<String>(this,   
android.R.layout.simple_list_item_1, 0);
btAdapter = BluetoothAdapter.getDefaultAdapter();
pairedDevices = new ArrayList<String>();
filter = new IntentFilter(BluetoothDevice.ACTION_FOUND);
devices = new ArrayList<BluetoothDevice>();
receiver = new BroadcastReceiver(){
    @Override
    public void onReceive(Context context, Intent intent){
        String action = intent.getAction();
            if(BluetoothDevice.ACTION_FOUND.equals(action)){
            BluetoothDevice device = 
 intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
            devices.add(device);
            String s = "";
            for(int a=0; a<pairedDevices.size();a++){
                if(device.getName().equals(pairedDevices.get(a))){
                    s = "(Paired)";
                    break;
                }
            } 
    listAdapter.add(device.getName()+""+s+""+"\n"+device.getAddress());
                        }else if 
 (BluetoothAdapter.ACTION_DISCOVERY_STARTED.equals(action)){
                        }else if 
 (BluetoothAdapter.ACTION_DISCOVERY_FINISHED.equals(action)){
                    }else if 
 (BluetoothAdapter.ACTION_STATE_CHANGED.equals(action)){
                    if (btAdapter.getState() == btAdapter.STATE_OFF){
                        turnOnBT();
                     }
                }
     }
    };
 registerReceiver(receiver, filter);
 IntentFilter filter = new   
 IntentFilter(BluetoothAdapter.ACTION_DISCOVERY_STARTED);
 registerReceiver(receiver, filter);
 filter = new IntentFilter(BluetoothAdapter.ACTION_DISCOVERY_FINISHED);
 registerReceiver(receiver, filter);
 filter = new 
 IntentFilter(BluetoothAdapter.ACTION_CONNECTION_STATE_CHANGED);
 }
@Override
protected void onPause(){
super.onPause();
unregisterReceiver(receiver);
}
protected void onActivityResult(int requestCode, int resultCode, Intent 
data){
super.onActivityResult(requestCode, resultCode, data);
if (resultCode == RESULT_CANCELED){
    Toast.makeText(getApplicationContext(), "Bluetooth must be enabled 
to continue", Toast.LENGTH_SHORT).show();
    }
    }
  @Override
  public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, 
 long  
arg3) {
// TODO Auto-generated method stub
if (btAdapter.isDiscovering()){
btAdapter.cancelDiscovery();
}
if (listAdapter.getItem(arg2).contains("(Paired)")){
BluetoothDevice selectedDevice = devices.get(arg2);
ConnectThread connect = 
new ConnectThread(selectedDevice);
connect.start();
}else { 
Toast.makeText(getApplicationContext(), "device is not paired",  
0).show();
  }
   }
    private class ConnectThread extends Thread {
    private final BluetoothSocket mmSocket;
    private final BluetoothDevice mmDevice;

    public ConnectThread(BluetoothDevice device) {
        // Use a temporary object that is later assigned to mmSocket,
        // because mmSocket is final
        BluetoothSocket tmp = null;
        mmDevice = device;

        // Get a BluetoothSocket to connect with the given 
  BluetoothDevice
        try {
            // MY_UUID is the app's UUID string, also used by the server 
  code
            tmp = device.createRfcommSocketToServiceRecord(MY_UUID);
        } catch (IOException e) { }
        mmSocket = tmp;
    }

    public void run() {
        // Cancel discovery because it will slow down the connection
        btAdapter.cancelDiscovery();

        try {
            // Connect the device through the socket. This will block
            // until it succeeds or throws an exception
            mmSocket.connect();
        } catch (IOException connectException) {
            // Unable to connect; close the socket and get out
            try {
                mmSocket.close();
            } catch (IOException closeException) { }
            return;
        }

        // Do work to manage the connection (in a separate thread)
    mHandler.obtainMessage(SUCCESS_CONNECT,mmSocket ).sendToTarget();
     }

     /** Will cancel an in-progress connection, and close the socket */
     public void cancel() {
        try {
            mmSocket.close();
        } catch (IOException e) { }
    }
    }
static class ConnectedThread extends Thread {
    private static final int MESSAGE_READ = 0;
    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;  // buffer store for the stream
        int bytes; // bytes returned from read()

        // Keep listening to the InputStream until an exception occurs
         while (true) {
            try {
                try{
                    sleep(30);
                } catch(InterruptedException e){
                    e.printStackTrace();
                }
                buffer = new byte[1024];
                // Read from the InputStream
                bytes = mmInStream.read(buffer);
                // Send the obtained bytes to the UI activity
                mHandler.obtainMessage(MESSAGE_READ, bytes, -1, buffer)
                        .sendToTarget();
            } catch (IOException e) {
                break;
            }
         }
      }
  /* Call this from the main activity to send
      *  data to the remote device */
     public void write(String income) {
        try {
        mmOutStream.write(income.getBytes());
        try {  
            Thread.sleep(20);
                }catch(InterruptedException e){
            e.printStackTrace();
        }
                } catch (IOException e) { }
    }

    /* Call this from the main activity to shutdown the connection */


    public void cancel() {
        try {
            mmSocket.close();
        } catch (IOException e) { }
    }
    }
    }*

MAIN ACTIVITY 代码如下所示:

package com.example.tut;
import android.app.Activity;
import android.bluetooth.BluetoothSocket;
import android.content.Intent;
import android.content.pm.ActivityInfo;
import android.graphics.Color;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.View;
import android.view.WindowManager;
import android.widget.Button;
import android.widget.LinearLayout;
import android.widget.Toast;
import android.widget.ToggleButton;
import com.example.tut.bluetooth.ConnectedThread;
import com.jjoe64.graphview.GraphView;
import com.jjoe64.graphview.GraphView.GraphViewData; 
import com.jjoe64.graphview.GraphView.LegendAlign; 
import com.jjoe64.graphview.GraphViewSeries;
import com.jjoe64.graphview.GraphViewSeries.GraphViewStyle;
import com.jjoe64.graphview.LineGraphView;


public class MainActivity extends Activity implements   
View.OnClickListener {
@Override
public void onBackPressed(){
    if (bluetooth.connectedThread !=null) 
bluetooth.connectedThread.write("Q");
    super.onBackPressed();
    }   
 Handler mHandler = new Handler(){
         @Override
     public void handleMessage(Message msg){
            super.handleMessage(msg);
            switch(msg.what){
            case bluetooth.SUCCESS_CONNECT:
                bluetooth.connectedThread = new 
 bluetooth.ConnectedThread((BluetoothSocket)msg.obj);

                Toast.makeText(getApplicationContext(), 
 "Connected", 0).show();
                String s ="Successfully connected";
                bluetooth.connectedThread.start();
                break;
            case bluetooth.MESSAGE_READ:        
                byte[] readBuf = (byte[]) msg.obj;
                String strIncom = new String(readBuf, 0 ,5);


 if (strIncom.indexOf('s')==0 && strIncom.indexOf('.')==2){
                    strIncom = strIncom.replace("s","");
                    if (isFloatNumber(strIncom)){

                        Series.appendData(new   
 GraphViewData(graph2LastXValue, 
 Double.parseDouble(strIncom)),AutoScrollX);

                        if( graph2LastXValue >= Xview && Lock == true ){

    Series.resetData(new GraphViewData[]{});
                            graph2LastXValue = 0;
                        }else graph2LastXValue +=0.1;


                    if (Lock == true) graphView.setViewPort(0 , Xview);


                        else graphView.setViewPort(graph2LastXValue- 
  Xview,  Xview);
                    //refresh
                        GraphView.removeView(graphView);
                        GraphView.addView(graphView);
                    }

                }
                break;
        }}



public boolean isFloatNumber(String num){
    try{
        Double.parseDouble(num);
    }
    catch(NumberFormatException nfe){
        return false;
    }
    return true;
    }
};


Button bConnect, bDisconnect, bXminus, bXplus;
ToggleButton tblock, tbScroll, tbStream;
static boolean Lock, AutoScrollX, Stream;
//graph init

static LinearLayout GraphView;
static GraphView graphView;
static GraphViewSeries Series;
private static double graph2LastXValue = 0;
private static int Xview = 10;




@Override
protected void
onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);

this.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,  
WindowManager.LayoutParams.FLAG_FULLSCREEN);
    setContentView(R.layout.activity_main);

    LinearLayout background = (LinearLayout)findViewById(R.id.bg);
    background.setBackgroundColor(Color.BLACK);
    init();
    Buttoninit();

    }
 void init(){
    bluetooth.gethandler(mHandler);
    GraphView = (LinearLayout) findViewById(R.id.Graph);
    Series = new GraphViewSeries("Signal",
            new GraphViewStyle(Color.YELLOW, 2),
            new GraphViewData[]{new GraphViewData(0,0)});
            graphView = new LineGraphView(this, "Graph");
            graphView.setViewPort(0, Xview);
            graphView.setScrollable(true);
            graphView.setScalable(true);
            graphView.setLegendAlign(LegendAlign.BOTTOM);
            graphView.setManualYAxis(true);
            graphView.setManualYAxisBounds(5, 0);
            graphView.addSeries(Series);
            graphView.addView(graphView);
            }
 void Buttoninit(){
 bConnect = (Button)findViewById(R.id.bConnect);
 bConnect.setOnClickListener(this);
 bDisconnect = (Button)findViewById(R.id.bDisconnect);
 bDisconnect.setOnClickListener(this);
 bXminus = (Button)findViewById(R.id.bXminus);
 bXminus.setOnClickListener(this);
 bXplus = (Button)findViewById(R.id.bXPlus);
 bXplus.setOnClickListener(this);
 tblock = (ToggleButton)findViewById(R.id.tblock);
 tblock.setOnClickListener(this);
 tbScroll = (ToggleButton)findViewById(R.id.tbScroll);
 tbScroll.setOnClickListener(this);
 tbStream = (ToggleButton)findViewById(R.id.tbStream);
 tbStream.setOnClickListener(this);
 Lock= true;
 AutoScrollX = true;
 Stream =false;


}

 @Override 
 public void onClick(View v){

switch(v.getId()){
case R.id.bConnect:
    startActivity(new Intent("android.intent.action.BT2"));


    break;
case R.id.bDisconnect:
    break;
case R.id.bXminus:
    if (Xview>1) Xview--;
    break;
    case R.id.bXPlus:
        if(Xview<30) Xview++;
        break;
    case R.id.tblock:
        break;

    case R.id.tbScroll:
        if(tbScroll.isChecked()){
            AutoScrollX = true;

        }else {
            AutoScrollX = false;

        }

        break;
    case R.id.tbStream:

        if (tbStream.isChecked()){

        if(bluetooth.connectedThread !=null)   
 bluetooth.connectedThread.write("E");
        }else{
            if(bluetooth.connectedThread !=null) 
  bluetooth.connectedThread.write("Q");

        }
    break;
}
}
}

Logcat 错误看起来像这样:

   02-08 04:45:53.730: D/dalvikvm(891): Not late-enabling CheckJNI (already on)
02-08 04:45:58.230: I/dalvikvm(891): threadid=1: stack overflow on call to Landroid/view/View;.getRawLayoutDirection:I
02-08 04:45:58.230: I/dalvikvm(891):   method requires 8+20+0=28 bytes, fp is 0xb2e9f30c (12 left)
02-08 04:45:58.230: I/dalvikvm(891):   expanding stack end (0xb2e9f300 to 0xb2e9f000)
02-08 04:45:58.230: I/dalvikvm(891): Shrank stack (to 0xb2e9f300, curFrame is 0xb2ea4ec4)
02-08 04:45:58.240: D/AndroidRuntime(891): Shutting down VM
02-08 04:45:58.240: W/dalvikvm(891): threadid=1: thread exiting with uncaught exception (group=0xb3aa0b90)
02-08 04:45:58.950: D/dalvikvm(891): GC_FOR_ALLOC freed 84K, 5% free 3197K/3348K, paused 107ms, total 119ms
02-08 04:45:59.310: D/dalvikvm(891): GC_FOR_ALLOC freed 302K, 11% free 3309K/3680K, paused 36ms, total 36ms
02-08 04:45:59.330: E/AndroidRuntime(891): FATAL EXCEPTION: main
02-08 04:45:59.330: E/AndroidRuntime(891): Process: com.example.tut, PID: 891
02-08 04:45:59.330: E/AndroidRuntime(891): java.lang.WhosebugError
02-08 04:45:59.330: E/AndroidRuntime(891):  at android.view.View.isLayoutDirectionInherited(View.java:12311)
02-08 04:45:59.330: E/AndroidRuntime(891):  at android.view.ViewGroup.resetResolvedLayoutDirection(ViewGroup.java:5713)
02-08 04:45:59.330: E/AndroidRuntime(891):  at android.view.ViewGroup.resetResolvedLayoutDirection(ViewGroup.java:5714)
02-08 04:45:59.330: E/AndroidRuntime(891):  at android.view.ViewGroup.resetResolvedLayoutDirection(ViewGroup.java:5714)
02-08 04:45:59.330: E/AndroidRuntime(891):  at android.view.ViewGroup.resetResolvedLayoutDirection(ViewGroup.java:5714)
02-08 04:45:59.330: E/AndroidRuntime(891):  at android.view.ViewGroup.resetResolvedLayoutDirection(ViewGroup.java:5714)
02-08 04:45:59.330: E/AndroidRuntime(891):  at android.view.ViewGroup.resetResolvedLayoutDirection(ViewGroup.java:5714)
02-08 04:45:59.330: E/AndroidRuntime(891):  at android.view.ViewGroup.resetResolvedLayoutDirection(ViewGroup.java:5714)
02-08 04:45:59.330: E/AndroidRuntime(891):  at android.view.ViewGroup.resetResolvedLayoutDirection(ViewGroup.java:5714)
02-08 04:45:59.330: E/AndroidRuntime(891):  at android.view.ViewGroup.resetResolvedLayoutDirection(ViewGroup.java:5714)
02-08 04:45:59.330: E/AndroidRuntime(891):  at android.view.ViewGroup.resetResolvedLayoutDirection(ViewGroup.java:5714)
02-08 04:45:59.330: E/AndroidRuntime(891):  at android.view.ViewGroup.resetResolvedLayoutDirection(ViewGroup.java:5714)
02-08 04:45:59.330: E/AndroidRuntime(891):  at android.view.ViewGroup.resetResolvedLayoutDirection(ViewGroup.java:5714)
02-08 04:45:59.330: E/AndroidRuntime(891):  at android.view.ViewGroup.resetResolvedLayoutDirection(ViewGroup.java:5714)
02-08 04:45:59.330: E/AndroidRuntime(891):  at android.view.ViewGroup.resetResolvedLayoutDirection(ViewGroup.java:5714)
02-08 04:45:59.330: E/AndroidRuntime(891):  at android.view.ViewGroup.resetResolvedLayoutDirection(ViewGroup.java:5714)
02-08 04:45:59.330: E/AndroidRuntime(891):  at android.view.ViewGroup.resetResolvedLayoutDirection(ViewGroup.java:5714)
02-08 04:45:59.330: E/AndroidRuntime(891):  at android.view.ViewGroup.resetResolvedLayoutDirection(ViewGroup.java:5714)
02-08 04:45:59.330: E/AndroidRuntime(891):  at android.view.ViewGroup.resetResolvedLayoutDirection(ViewGroup.java:5714)
02-08 04:45:59.330: E/AndroidRuntime(891):  at android.view.ViewGroup.resetResolvedLayoutDirection(ViewGroup.java:5714)
02-08 04:45:59.330: E/AndroidRuntime(891):  at android.view.ViewGroup.resetResolvedLayoutDirection(ViewGroup.java:5714)
02-08 04:45:59.330: E/AndroidRuntime(891):  at android.view.ViewGroup.resetResolvedLayoutDirection(ViewGroup.java:5714)
02-08 04:45:59.330: E/AndroidRuntime(891):  at android.view.ViewGroup.resetResolvedLayoutDirection(ViewGroup.java:5714)
02-08 04:45:59.330: E/AndroidRuntime(891):  at android.view.ViewGroup.resetResolvedLayoutDirection(ViewGroup.java:5714)
02-08 04:45:59.330: E/AndroidRuntime(891):  at android.view.ViewGroup.resetResolvedLayoutDirection(ViewGroup.java:5714)
02-08 04:45:59.330: E/AndroidRuntime(891):  at android.view.ViewGroup.resetResolvedLayoutDirection(ViewGroup.java:5714)
02-08 04:45:59.330: E/AndroidRuntime(891):  at android.view.ViewGroup.resetResolvedLayoutDirection(ViewGroup.java:5714)
02-08 04:45:59.330: E/AndroidRuntime(891):  at android.view.ViewGroup.resetResolvedLayoutDirection(ViewGroup.java:5714)
02-08 04:45:59.330: E/AndroidRuntime(891):  at android.view.ViewGroup.resetResolvedLayoutDirection(ViewGroup.java:5714)
02-08 04:45:59.330: E/AndroidRuntime(891):  at android.view.ViewGroup.resetResolvedLayoutDirection(ViewGroup.java:5714)
02-08 04:45:59.330: E/AndroidRuntime(891):  at android.view.ViewGroup.resetResolvedLayoutDirection(ViewGroup.java:5714)
02-08 04:45:59.330: E/AndroidRuntime(891):  at android.view.ViewGroup.resetResolvedLayoutDirection(ViewGroup.java:5714)
02-08 04:45:59.330: E/AndroidRuntime(891):  at android.view.ViewGroup.resetResolvedLayoutDirection(ViewGroup.java:5714)
02-08 04:45:59.330: E/AndroidRuntime(891):  at android.view.ViewGroup.resetResolvedLayoutDirection(ViewGroup.java:5714)
02-08 04:45:59.330: E/AndroidRuntime(891):  at android.view.ViewGroup.resetResolvedLayoutDirection(ViewGroup.java:5714)
02-08 04:45:59.330: E/AndroidRuntime(891):  at android.view.ViewGroup.resetResolvedLayoutDirection(ViewGroup.java:5714)
02-08 04:45:59.330: E/AndroidRuntime(891):  at android.view.ViewGroup.resetResolvedLayoutDirection(ViewGroup.java:5714)
02-08 04:45:59.330: E/AndroidRuntime(891):  at android.view.ViewGroup.resetResolvedLayoutDirection(ViewGroup.java:5714)
02-08 04:45:59.330: E/AndroidRuntime(891):  at android.view.ViewGroup.resetResolvedLayoutDirection(ViewGroup.java:5714)
02-08 04:45:59.330: E/AndroidRuntime(891):  at android.view.ViewGroup.resetResolvedLayoutDirection(ViewGroup.java:5714)
02-08 04:45:59.330: E/AndroidRuntime(891):  at android.view.ViewGroup.resetResolvedLayoutDirection(ViewGroup.java:5714)
02-08 04:45:59.330: E/AndroidRuntime(891):  at android.view.ViewGroup.resetResolvedLayoutDirection(ViewGroup.java:5714)
02-08 04:45:59.330: E/AndroidRuntime(891):  at android.view.ViewGroup.resetResolvedLayoutDirection(ViewGroup.java:5714)
02-08 04:45:59.330: E/AndroidRuntime(891):  at android.view.ViewGroup.resetResolvedLayoutDirection(ViewGroup.java:5714)
02-08 04:45:59.330: E/AndroidRuntime(891):  at android.view.ViewGroup.resetResolvedLayoutDirection(ViewGroup.java:5714)
02-08 04:45:59.330: E/AndroidRuntime(891):  at android.view.ViewGroup.resetResolvedLayoutDirection(ViewGroup.java:5714)
02-08 04:45:59.330: E/AndroidRuntime(891):  at android.view.ViewGroup.resetResolvedLayoutDirection(ViewGroup.java:5714)
02-08 04:45:59.330: E/AndroidRuntime(891):  at android.view.ViewGroup.resetResolvedLayoutDirection(ViewGroup.java:5714)
02-08 04:45:59.330: E/AndroidRuntime(891):  at android.view.ViewGroup.resetResolvedLayoutDirection(ViewGroup.java:5714)
02-08 04:45:59.330: E/AndroidRuntime(891):  at android.view.ViewGroup.resetResolvedLayoutDirection(ViewGroup.java:5714)
02-08 04:45:59.330: E/AndroidRuntime(891):  at android.view.ViewGroup.resetResolvedLayoutDirection(ViewGroup.java:5714)
02-08 04:45:59.330: E/AndroidRuntime(891):  at android.view.ViewGroup.resetResolvedLayoutDirection(V
02-08 04:45:59.540: D/dalvikvm(891): GC_FOR_ALLOC freed 523K, 16% free 3263K/3860K, paused 63ms, total 63ms
02-08 04:47:31.719: I/Process(891): Sending signal. PID: 891 SIG: 9

布局蓝牙

<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" >

<TextView
    android:id="@+id/tvPd"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_alignParentTop="true"
    android:text="Paired Devices" >
</TextView>

<ListView
    android:id="@+id/listView"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_above="@+id/bConnectNew"
    android:layout_alignParentLeft="true"
    android:layout_below="@+id/tvPd" >
</ListView>

</RelativeLayout>

布局ACTIVITY_MAIN

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/bg"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:keepScreenOn="true"
android:orientation="horizontal"
android:weightSum="100" >

<LinearLayout
    android:id="@+id/Graph"
    android:layout_width="fill_parent"
    android:layout_height="match_parent"
    android:orientation="horizontal"
    android:layout_weight="15" />

<LinearLayout
    android:id="@+id/LL2"
    android:layout_width="fill_parent"
    android:layout_height="match_parent"
    android:layout_weight="85"
    android:orientation="vertical" >

    <TextView
        android:id="@+id/tvBluetooth"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentTop="true"
        android:text="Bluetooth"
        android:textSize="15dp" 
        android:textColor="@color/white"/>

    <Button
        android:id="@+id/bConnect"
        android:layout_width="fill_parent"
        android:layout_height="30dp"
        android:text="Connect"
        android:textSize="10dp" 
        android:textColor="@color/white"/>

    <Button
        android:id="@+id/bDisconnect"
        android:layout_width="fill_parent"
        android:layout_height="30dp"
        android:text="Disconnect"
        android:textSize="10dp" 
        android:textColor="@color/white"/>

    <TextView
        android:id="@+id/tvControl"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentTop="true"
        android:text="Control"
        android:textSize="15dp"
        android:textColor="@color/white" />

    <ToggleButton
        android:id="@+id/tbStream"
        android:layout_width="fill_parent"
        android:layout_height="50dp"
        android:layout_alignParentLeft="true"
        android:checked="false"
        android:textOff="Start Stream"
        android:textOn="Start Stream" 
        android:textColor="@color/white"/>

    <ToggleButton
        android:id="@+id/tbScroll"
        android:layout_width="fill_parent"
        android:layout_height="50dp"
        android:layout_alignParentLeft="true"
        android:checked="true"
        android:textOff="Auto Scroll X"
        android:textOn="Auto Scroll X"
        android:textColor="@color/white" />

    <ToggleButton
        android:id="@+id/tbLock"
        android:layout_width="fill_parent"
        android:layout_height="50dp"
        android:layout_alignParentLeft="true"
        android:checked="true"
        android:textOff="Lock    Xaxis"
        android:textOn="Lock    Xaxis"
        android:textColor="@color/white" />

    <LinearLayout
        android:id="@+id/LLX"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true"
        android:orientation="horizontal"
        android:weightSum="100" >

        <Button
            android:id="@+id/bXminus"
            android:layout_width="match_parent"
            android:layout_height="30dp"
            android:layout_weight="50"
            android:text="-"
            android:textSize="12dp" 
            android:textColor="@color/white"/>

        <Button
            android:id="@+id/bXplus"
            android:layout_width="match_parent"
            android:layout_height="30dp"
            android:layout_weight="50"
            android:text="+"
            android:textSize="12dp" 
            android:textColor="@color/white"/>
    </LinearLayout>
</LinearLayout>

</LinearLayout>

ARDUINO 代码

#define sensorPin A0

void setup() {
Serial.begin(115200);
}

void loop() {
 if(Serial.available()>0){ 
char re = Serial.read();

switch(re){
 case 'E':
 start();
 break; 
}
}
}

void start(){
while(1){
Serial.print('s');
Serial.print(floatMap(analogRead(sensorPin),0,1023,0,5),2);
delay(10);

if(Serial.available()>0){
if (Serial.read()=='Q') return;
}
} 
}

float floatMap(float x, float inMin, float inMax, float outMin, float  
outMax){
return (x-inMin)*(outMax-outMin)/(inMax-inMin)+outMin;
}

MainActivityinit方法中,替换

graphView.addView(graphView);

GraphView.addView(graphView);

您不应该向自身添加视图。

这应该可以解决问题。