首页 > 解决方案 > android studio java使用蓝牙错误从arduino接收数据

问题描述

当我运行我的 Andriod 应用程序时,它在通过 BC417_ 蓝牙与 Arduino 连接后给了我这个问题:

I/GPUD: @gpudInitialize: successfully initialized with GL, dbg=0 mmdump_dbg=0 mmpath_dbg=0
E/AwareLog: AtomicFileUtils: readFileLines file not exist: android.util.AtomicFile@5e29f04
E/GED: Failed to get GED Log Buf, err(0)
V/ActivityThread: callActivityOnCreate
V/HwWidgetFactory:: successes to get AllImpl object and return...
I/DecorView[]:  old windowMode:0 new windoMode:1
D/receivedata: ...Bluetooth ON...
D/ActivityThread: add activity client record, r= ActivityRecord{5a9f488 token=android.os.BinderProxy@fefc6b1 {com.example.receivedata/com.example.receivedata.MainActivity}} token= android.os.BinderProxy@fefc6b1
D/receivedata: ...onResume - try connect...
D/receivedata: ...Connecting...
D/BluetoothSocket: BT connect calling pid/uid = 31322/10165
W/BluetoothAdapter: getBluetoothService() called with no BluetoothManagerCallback
D/receivedata: ....Connection ok...
    ...Create Socket...
D/HiTouch_PressGestureDetector: onAttached, package=com.example.receivedata, windowType=1, mHiTouchRestricted=false
D/mali_winsys: EGLint new_window_surface(egl_winsys_display *, void *, EGLSurface, EGLConfig, egl_winsys_surface **, EGLBoolean) returns 0x3000
W/Gralloc3: mapper 3.x is not supported
E/gralloc: Arm Module v1.0
E/ion: ioctl c0044901 failed with code -1: Invalid argument
I/HwViewRootImpl: removeInvalidNode jank list is null
D/DecorView: showOrHideHighlightView: hasFocus=true; winMode=1; isMrgNull=true
W/InputMethodManager: startInputReason = 1
W/InputMethodManager: startInputReason = 5
I/QarthLog: [PatchStore] createDisableExceptionQarthFile
    [PatchStore] create disable file for com.example.receivedata uid is 10165
E/AndroidRuntime: FATAL EXCEPTION: Thread-2
    Process: com.example.receivedata, PID: 31322
    java.lang.NullPointerException: Attempt to invoke virtual method 'android.os.Message android.os.Handler.obtainMessage(int, int, int,java.lang.Object)' on a null object reference
        at com.example.receivedata.MainActivity$ConnectedThread.run(MainActivity.java:192)
D/receivedata: ...In onPause()...
D/BluetoothSocket: close() this: android.bluetooth.BluetoothSocket@f9b95cd, channel: 1, mSocketIS: android.net.LocalSocketImpl$SocketInputStream@6716e82, mSocketOS: android.net.LocalSocketImpl$SocketOutputStream@883d993mSocket: android.net.LocalSocket@7209dd0 impl:android.net.LocalSocketImpl@7d8c1c9 fd:java.io.FileDescriptor@ccbf0ce, mSocketState: CONNECTED
I/Process: Sending signal. PID: 31322 SIG: 9

连接后错误是运行时错误,当我的应用程序尝试从 Arduino 接收数据时,会出现问题:

E/AndroidRuntime:致命异常:线程 2 进程:com.example.receivedata,PID:31322 java.lang.NullPointerException:尝试调用虚拟方法 'android.os.Message android.os.Handler.obtainMessage(int, int, int,java.lang.Object)' 在 com.example.receivedata.MainActivity$ConnectedThread.run(MainActivity.java:192) 的空对象引用上


Arduino(Java)代码:

package com.example.receivedata;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.lang.reflect.Method;
import java.util.UUID;
import android.annotation.SuppressLint;
import android.app.Activity;
import android.bluetooth.BluetoothAdapter;
import android.bluetooth.BluetoothDevice;
import android.bluetooth.BluetoothSocket;
import android.content.Intent;
import android.os.Build;
import android.os.Bundle;
import android.os.Handler;
import android.util.Log;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;

public class MainActivity extends Activity {
    private static final String TAG = "receivedata";
    TextView txtArduino;
    Handler h;

    final int RECIEVE_MESSAGE = 1;        // Status  for Handler
    private BluetoothAdapter btAdapter = null;
    private BluetoothSocket btSocket = null;
    private final 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 final String address = "98:D3:32:30:82:85";

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        txtArduino = findViewById(R.id.txtArduino);      // for display the received data from the Arduino

       @SuppressLint("HandlerLeak") Handler h = new Handler() {
            @SuppressLint({"HandlerLeak", "SetTextI18n"})
            public void handleMessage(android.os.Message msg) {
                if (msg.what == RECIEVE_MESSAGE) {                                                   // if receive massage
                    String readBuf = (String) msg.obj;
                    sb.append(readBuf);                                                // append string
                    int endOfLineIndex = sb.indexOf("\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.append(String.format("BPM: %s", sbprint));
                        mConnectedThread.write("x");
                    }
                    //Log.d(TAG, "...String:"+ sb.toString() +  "Byte:" + msg.arg1 + "...");
                }
            };
        };

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

    @SuppressLint("ObsoleteSdkInt")
    private BluetoothSocket createBluetoothSocket(BluetoothDevice device) throws IOException {
        if(Build.VERSION.SDK_INT >= 10){
            try {
                final Method  m = device.getClass().getMethod("createInsecureRfcommSocketToServiceRecord", UUID.class);
                return (BluetoothSocket) m.invoke(device, MY_UUID);
            } catch (Exception e) {
                Log.e(TAG, "Could not create Insecure RFComm Connection",e);
            }
        }
        return  device.createRfcommSocketToServiceRecord(MY_UUID);
    }

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

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

        // Set up a pointer to the remote node using its 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 = createBluetoothSocket(device);
        } 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 the server.
        Log.d(TAG, "...Create Socket...");

        mConnectedThread = new ConnectedThread(btSocket);
        mConnectedThread.start();
        //I send a character when resuming.beginning transmission to check device is connected
        //If it is not an exception will be thrown in the write method and finish() will be called
        mConnectedThread.write("x");

    }

    @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 support");
        } else {
            if (btAdapter.isEnabled()) {
                Log.d(TAG, "...Bluetooth ON...");
            } else {
                //Prompt user to turn on Bluetooth
                Intent enableBtIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
                startActivityForResult(enableBtIntent, 1);

            }
        }
    }

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

    //create new class for connect thread
    private class ConnectedThread extends Thread {
        private final InputStream mmInStream;
        private final OutputStream mmOutStream;
        //creation of the connect thread
        public ConnectedThread(BluetoothSocket socket) {
            InputStream tmpIn = null;
            OutputStream tmpOut = null;

            try {
                //Create I/O streams for connection
                tmpIn = socket.getInputStream();
                tmpOut = socket.getOutputStream();
            } catch (IOException e) { }

            mmInStream = tmpIn;
            mmOutStream = tmpOut;
        }

        public void run() {
            byte[] buffer = new byte[256];
            int bytes=0;

            // Keep looping to listen for received messages
            while (true) {
                try {
                    buffer[bytes] = (byte) mmInStream.read();            //read bytes from input buffer
                    if((buffer[bytes] == '\n'))
                     // Send the obtained bytes to the UI Activity via handler
                    {
                        h.obtainMessage(RECIEVE_MESSAGE, bytes, -1, buffer).sendToTarget();
                        bytes=0;
                    }
                    else
                        bytes++;
                } catch (IOException e) {
                    break;
                }
            }
        }
        //write method
        public void write(String input) {
            byte[] msgBuffer = input.getBytes();           //converts entered String into bytes
            try {
                mmOutStream.write(msgBuffer);                //write bytes over BT connection via outstream
            } catch (IOException e) {
                //if you cannot write, close the application
                Toast.makeText(getBaseContext(), "Connection Failure", Toast.LENGTH_LONG).show();

            }
        }
    }

}

Arduino代码:

char incomingByte;  // incoming data
int  LED = 13;      // LED pin
int BPM_Last=0;
void setup() {
  Serial.begin(9600); // initialization
  pinMode(LED, OUTPUT);
  Serial.println("Press 1 to LED ON or 0 to LED OFF...");
}
 
void loop() {
  int BPM=random(80, 100);
  //byte out[4];
  if (Serial.available() > 0) {  // if the data came
    if(incomingByte==' ')
      incomingByte = Serial.read(); // read byte
    if(incomingByte == 'x'&&BPM!=BPM_Last) {
       digitalWrite(LED, HIGH); // if 0, switch LED on
       Serial.println("LED ON. Press 0 to LED OFF!");
       /*for(int i=0;i<3;i++){
        out[i]=BPM%10;
        BPM/=10;
        }
        out[3]='\n';*/
       Serial.write(BPM);
       Serial.write('\n');
       incomingByte = ' ';       
       BPM_Last=BPM;
    }
    else
    {
       digitalWrite(LED, LOW);  // if 1, switch LED Off
       Serial.println("LED OFF. Press 1 to LED ON!");  // print message
       
    }
  }
}

标签: javaandroidbluetoothruntime-errorarduino-uno

解决方案


推荐阅读