1

因此,对于我的研究,我必须将加速度计数据作为恒定流发送到 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();
                    }
                }
            }
        };
    };
}
4

2 回答 2

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

然后tread的run()方法负责取回数据

有关在 Android 中通过蓝牙接收 xml 字符串的示例错误,请参见我在此线程中的答案

祝你好运!

于 2013-03-06T03:23:13.540 回答
-1

从 arduino 中查看此页面:http://arduino.cc/en/Reference/Loop问题 是它只运行一次,因为它不是一个循环,直到设备关闭或以其他方式被告知。

于 2013-03-06T03:20:12.367 回答