1

したがって、私の研究では、加速度計のデータを一定のストリームとして arduino メガに送信する必要があります。モジュールをシリアル経由でarduinoに接続しました。ただし、コードを実行すると、一度しか実行されません。コードの精度変更部分内にコードの Bluetooth 接続部分を配置しようとしましたが、デバイスがフリーズし続けます。これが私のコードです:

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

ブロードキャスト レシーバーで Bluetooth ソケットを作成して接続する必要があるかどうかはわかりません。アクティビティの onResume() で Bluetooth 接続管理を行います。

また、スレッドを使用して、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() メソッドがデータを取得します。

Android で Bluetooth 経由で xml 文字列を受信する際のエラーの例については、このスレッドの私の回答を参照してください。

幸運を!

于 2013-03-06T03:23:13.540 に答える
-1

arduino のこのページをチェックしてください: http://arduino.cc/en/Reference/Loop 問題は、デバイスがオフになるか別の方法で通知されるまで永遠に続くループに入っていないため、1 回しか実行されないことです。

于 2013-03-06T03:20:12.367 に答える