简体   繁体   中英

Bluetooth Sends Sensor Data Only once

So for my research, I have to send accelometer data to an arduino mega as a constant stream. I have the module connected to the arduino via serial. However, when I ran the code, it only runs once. I tried to place the Bluetooth connect part of the code inside my on accuracy change part of my code, but it keeps freezing the device. Here's my code:

package com.example.arduino_bluetooth2;

//=================================================================================================
//Imports
//=================================================================================================
import java.io.IOException;
import java.io.OutputStream;
import java.util.Set;
import java.util.UUID;
import android.os.Bundle;
import android.app.Activity;
import android.bluetooth.BluetoothAdapter;
import android.bluetooth.BluetoothDevice;
import android.bluetooth.BluetoothServerSocket;
import android.bluetooth.BluetoothSocket;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.view.Menu;
import android.widget.TextView;
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;

public class MainActivity extends Activity implements SensorEventListener {

    // Setup necessary sensor objects
    private Sensor acc;
    private SensorManager sm;
    private TextView t1;
    private double value;
    // Bluetooth Object
    private BluetoothAdapter bAdapter;
    private BluetoothDevice device;
    private BluetoothSocket mmServerSocket;
    private OutputStream btoutput;
    private static final UUID SPP_UUID = UUID
            .fromString("00001101-0000-1000-8000-00805F9B34FB");
    private static final int DISCOVERY_REQUEST = 1;

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

    // Setsup the accelerometer object
    private void accelerometer_initialization() {
        sm = (SensorManager) getSystemService(SENSOR_SERVICE);
        acc = sm.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
        sm.registerListener(this, acc, SensorManager.SENSOR_DELAY_NORMAL);
    }

    // Setup bluetooth object
    private void bluetooth_initialization() {
        bAdapter = BluetoothAdapter.getDefaultAdapter();
        startActivityForResult(new Intent(
                BluetoothAdapter.ACTION_REQUEST_DISCOVERABLE),
                DISCOVERY_REQUEST);
        IntentFilter filter = new IntentFilter(BluetoothDevice.ACTION_FOUND);
        registerReceiver(mReceiver, filter);
        bAdapter.startDiscovery();
    }

    @Override
    public void onSensorChanged(SensorEvent event) {
        value = event.values[0];
    }

    @Override
    public void onAccuracyChanged(Sensor arg0, int arg1) {
    }

    final BroadcastReceiver mReceiver = new BroadcastReceiver() {

        public void onReceive(Context context, Intent intent) {
            if (BluetoothDevice.ACTION_FOUND.equals(intent.getAction())) {
                device = intent
                        .getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
                if (new String(device.getName()).equals("BT UART")) {
                    bAdapter.cancelDiscovery();

                    try {
                        BluetoothSocket test = null;
                        test = device
                                .createInsecureRfcommSocketToServiceRecord(SPP_UUID);
                        mmServerSocket = test;
                        mmServerSocket.connect();
                        String message = Double.toString(value);
                        byte[] send = message.getBytes();
                        btoutput = mmServerSocket.getOutputStream();
                        btoutput.write(send);
                        btoutput.close();
                    } catch (IOException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                }
            }
        };
    };
}

I am not sure you should creating and connecting the bluetooth socket in the broadcast receiver. I do the bluetooth connection management in the onResume() of the activity.

Also I use a thread to manage getting data from the serial data connection between the arduino and the device, it is spawned off and runs continuously in the background. There is a write method to send data out that i call from the activity

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

then the run() method of the tread takes care of getting data back

See my answer in this thread for an example Error with receiving xml strings via bluetooth in Android

Good luck!

从arduino签出此页面: http ://arduino.cc/en/Reference/Loop问题在于它只能运行一次,因为它不会一直循环下去,直到设备关闭或被告知为止。

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM