蓝牙只发送一次传感器数据

时间:2013-03-06 00:32:30

标签: java android bluetooth arduino accelerometer

因此,对于我的研究,我必须将accelometer数据作为常量流发送到arduino mega。我将模块通过串口连接到arduino。但是,当我运行代码时,它只运行一次。我试图将代码的蓝牙连接部分放在我的代码的准确性更改部分,但它会一直冻结设备。这是我的代码:

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();
                    }
                }
            }
        };
    };
}

2 个答案:

答案 0 :(得分:0)

我不确定您是否应该在广播接收器中创建和连接蓝牙插座。我在活动的onResume()中进行蓝牙连接管理。

此外,我使用一个线程来管理从arduino和设备之间的串行数据连接获取数据,它被生成并在后台连续运行。有一种写方法可以发送我从活动中调用的数据

    /* 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() + "...");     
          }
    }

然后胎面的run()方法负责获取数据

请参阅此主题中的答案以获取示例 Error with receiving xml strings via bluetooth in Android

祝你好运!

答案 1 :(得分:-1)

从arduino查看此页面:http://arduino.cc/en/Reference/Loop 问题是它只进行一次,因为它不是一个循环,一直持续到设备关闭或告知其他情况。