Arduino /处理蓝牙通信[Android,HC-06]

时间:2013-12-04 02:21:39

标签: android bluetooth arduino processing

所以我试图通过HC-06芯片与Arduino Uno通信,但即使建立连接后,SoftwareSerial也无法读取。处理代码主要来自本文: http://arduinobasics.blogspot.com/2013/03/arduinobasics-bluetooth-android_25.html

任何人都可以帮我解决问题所在吗?

处理代码:

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.widget.Toast;
import android.view.Gravity;
import android.bluetooth.BluetoothAdapter;
import android.bluetooth.BluetoothDevice;
import java.util.UUID;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import android.os.Handler;
import android.os.Message;
import android.util.Log;

import android.bluetooth.BluetoothServerSocket;
import android.bluetooth.BluetoothSocket;
public BluetoothSocket scSocket;


boolean foundDevice=false; //When true, the screen turns green.
boolean BTisConnected=false; //When true, the screen turns purple.
String serverName = "ArduinoBasicsServer";

// Message types used by the Handler
public static final int MESSAGE_WRITE = 1;
public static final int MESSAGE_READ = 2;
String readMessage="";

//Get the default Bluetooth adapter
BluetoothAdapter bluetooth = BluetoothAdapter.getDefaultAdapter();

/*The startActivityForResult() within setup() launches an 
 Activity which is used to request the user to turn Bluetooth on. 
 The following onActivityResult() method is called when this 
 Activity exits. */
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
 if (requestCode==0) {
 if (resultCode == RESULT_OK) {
 ToastMaster("Bluetooth has been switched ON");
 } 
 else {
 ToastMaster("You need to turn Bluetooth ON !!!");
 }
 }
}


/* Create a BroadcastReceiver that will later be used to 
 receive the names of Bluetooth devices in range. */
BroadcastReceiver myDiscoverer = new myOwnBroadcastReceiver();


/* Create a BroadcastReceiver that will later be used to
 identify if the Bluetooth device is connected */
BroadcastReceiver checkIsConnected = new myOwnBroadcastReceiver();


// The Handler that gets information back from the Socket
private final Handler mHandler = new Handler() {
 @Override
 public void handleMessage(Message msg) {
 switch (msg.what) {
 case MESSAGE_WRITE:
 //Do something when writing
 break;
 case MESSAGE_READ:
 //Get the bytes from the msg.obj
 byte[] readBuf = (byte[]) msg.obj;
 // construct a string from the valid bytes in the buffer
 readMessage = new String(readBuf, 0, msg.arg1);
 break;
 }
 }
};


void setup() {
 orientation(LANDSCAPE);
 /*IF Bluetooth is NOT enabled, then ask user permission to enable it */
 if (!bluetooth.isEnabled()) {
 Intent requestBluetooth = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
 startActivityForResult(requestBluetooth, 0);
 }


 /*If Bluetooth is now enabled, then register a broadcastReceiver to report any
 discovered Bluetooth devices, and then start discovering */
 if (bluetooth.isEnabled()) {
 registerReceiver(myDiscoverer, new IntentFilter(BluetoothDevice.ACTION_FOUND));
 registerReceiver(checkIsConnected, new IntentFilter(BluetoothDevice.ACTION_ACL_CONNECTED));

 //Start bluetooth discovery if it is not doing so already
 if (!bluetooth.isDiscovering()) {
 bluetooth.startDiscovery();
 }
 }
}


void draw() {
 //Display a green screen if a device has been found,
 //Display a purple screen when a connection is made to the device
 if (foundDevice) {
 if (BTisConnected) {
 background(170, 50, 255); // purple screen
 }
 else {
 background(10, 255, 10); // green screen
 }
 }

 //Display anything received from Arduino
 text(readMessage, 10, 10);
}


/* This BroadcastReceiver will display discovered Bluetooth devices */
public class myOwnBroadcastReceiver extends BroadcastReceiver {
 ConnectToBluetooth connectBT;

 @Override
 public void onReceive(Context context, Intent intent) {
 String action=intent.getAction();
 ToastMaster("ACTION:" + action);

 //Notification that BluetoothDevice is FOUND
 if (BluetoothDevice.ACTION_FOUND.equals(action)) {
 //Display the name of the discovered device
 String discoveredDeviceName = intent.getStringExtra(BluetoothDevice.EXTRA_NAME);
 ToastMaster("Discovered: " + discoveredDeviceName);

 //Display more information about the discovered device
 BluetoothDevice discoveredDevice = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
 if(discoveredDevice.getName()=="HC-06"){
   ToastMaster("getAddress() = " + discoveredDevice.getAddress());
   ToastMaster("getName() = " + discoveredDevice.getName());

   int bondyState=discoveredDevice.getBondState();
   ToastMaster("getBondState() = " + bondyState);

   String mybondState;
   switch(bondyState) {
   case 10: 
   mybondState="BOND_NONE";
   break;
   case 11: 
   mybondState="BOND_BONDING";
   break;
   case 12: 
   mybondState="BOND_BONDED";
   break;
   default: 
   mybondState="INVALID BOND STATE";
   break;
   }
   ToastMaster("getBondState() = " + mybondState);
 }
 //Change foundDevice to true which will make the screen turn green
 foundDevice=true;

 //Connect to the discovered bluetooth device (SeeedBTSlave)
 if (discoveredDeviceName.equals("HC-06")) {
   ToastMaster("Connecting you Now !!");
   unregisterReceiver(myDiscoverer);
   connectBT = new ConnectToBluetooth(discoveredDevice);
 //Connect to the the device in a new thread
   new Thread(connectBT).start();
 }
 }

 //Notification if bluetooth device is connected
 if (BluetoothDevice.ACTION_ACL_CONNECTED.equals(action)) {
   ToastMaster("CONNECTED _ YAY");

   while (scSocket==null) {
 //do nothing
   }
   ToastMaster("scSocket " + scSocket);
   BTisConnected=true; //turn screen purple 
   if (scSocket!=null) {
     SendReceiveBytes sendReceiveBT = new SendReceiveBytes(scSocket);
     new Thread(sendReceiveBT).start();
     String red = "r";
     byte[] myByte = stringToBytesUTFCustom(red);
     sendReceiveBT.write(myByte);
   }
 }
 }
}
  public static byte[] stringToBytesUTFCustom(String str) {
    char[] buffer = str.toCharArray();
    byte[] b = new byte[buffer.length << 1];
    for (int i = 0; i < buffer.length; i++) {
    int bpos = i << 1;
    b[bpos] = (byte) ((buffer[i]&0xFF00)>>8);
    b[bpos + 1] = (byte) (buffer[i]&0x00FF);
  }
  return b;
}

public class ConnectToBluetooth implements Runnable {
 private BluetoothDevice btShield;
 private BluetoothSocket mySocket = null;
 private UUID uuid = UUID.fromString("00001101-0000-1000-8000-00805F9B34FB");

 public ConnectToBluetooth(BluetoothDevice bluetoothChip) {
 btShield = bluetoothChip;
 try {
 mySocket = btShield.createRfcommSocketToServiceRecord(uuid);
 }
 catch(IOException createSocketException) {
 //Problem with creating a socket
 Log.e("ConnectToBluetooth", "Error with Socket");
 }
 }

 @Override
 public void run() {
 /* Cancel discovery on Bluetooth Adapter to prevent slow connection */
 bluetooth.cancelDiscovery();

 try {
 /*Connect to the bluetoothShield through the Socket. This will block
 until it succeeds or throws an IOException */
 mySocket.connect();
 scSocket=mySocket;
 } 
 catch (IOException connectException) {
 Log.e("ConnectToBluetooth", "Error with Socket Connection");
 try {
 mySocket.close(); //try to close the socket
 }
 catch(IOException closeException) {
 }
 return;
 }
 }

 /* Will cancel an in-progress connection, and close the socket */
 public void cancel() {
 try {
 mySocket.close();
 } 
 catch (IOException e) {
 }
 }
}


private class SendReceiveBytes implements Runnable {
 private BluetoothSocket btSocket;
 private InputStream btInputStream = null;
 private OutputStream btOutputStream = null;

 public SendReceiveBytes(BluetoothSocket socket) {
 btSocket = socket;
 try {
   btInputStream = btSocket.getInputStream();
   btOutputStream = btSocket.getOutputStream();
 } 
 catch (IOException streamError) { 
   println("Error when getting input or output Stream");
 }
 }


 public void run() {
 byte[] buffer = new byte[1024]; // buffer store for the stream
 int bytes; // bytes returned from read()

 // Keep listening to the InputStream until an exception occurs
 while (true) {
 try {
 // Read from the InputStream
 bytes = btInputStream.read(buffer);
 // Send the obtained bytes to the UI activity
 mHandler.obtainMessage(MESSAGE_READ, bytes, -1, buffer)
 .sendToTarget();
 } 
 catch (IOException e) {
 println("Error reading from btInputStream");
 break;
 }
 }
 }


 /* Call this from the main activity to send data to the remote device */
 public void write(byte[] bytes) {
 try {
 btOutputStream.write(bytes);
 } 
 catch (IOException e) { 
 println("Error when writing to btOutputStream");
 }
 }


 /* Call this from the main activity to shutdown the connection */
 public void cancel() {
 try {
 btSocket.close();
 } 
 catch (IOException e) { 
 println("Error when closing the btSocket");
 }
 }
}



/* My ToastMaster function to display a messageBox on the screen */
void ToastMaster(String textToDisplay) {
 Toast myMessage = Toast.makeText(getApplicationContext(), 
 textToDisplay, 
 Toast.LENGTH_SHORT);
 myMessage.setGravity(Gravity.CENTER, 0, 0);
 myMessage.show();
}

Arduino代码:

int data;
char character;
int start_flag = 0;
#include <SoftwareSerial.h>

int bluetoothTx = 3;
int bluetoothRx = 2;

SoftwareSerial blue = SoftwareSerial(bluetoothRx, bluetoothTx);

void setup(){
  blue.begin(9600); 
  pinMode(13, OUTPUT);
  pinmode(bluetoothRx, INPUT);
  pinmode(bluetoothTx, OUTPUT);
  digitalWrite(13, LOW);
}


void loop() {

  if (blue.available() > 0) {
    digitalWrite(13, HIGH);

    character = (char) blue.read();      
    if (character != '#') {

      start_flag = 1;
    }
    if(character == 't'){

      start_flag = 0;          
    }

  } else {
    digitalWrite(13, HIGH);
    delay(100);
    digitalWrite(13, LOW);
    delay(100);
    digitalWrite(13, HIGH);
    delay(100);
    digitalWrite(13, LOW);
    delay(100);
    digitalWrite(13, HIGH);
    delay(100);
    digitalWrite(13, LOW);
    delay(100);
    digitalWrite(13, HIGH);
    delay(100);
    digitalWrite(13, LOW);
    delay(100);
  }


  if (start_flag == 1) {
    //digitalWrite(13, HIGH);
    blue.print(data); //data that was acquired by internal ADC

  }

}

3 个答案:

答案 0 :(得分:0)

我认为您需要在Arduino setup()代码中更改行的顺序: 而且您还需要一些代码来初始化您的蓝牙模块。 这就是我认为您需要将其更改为:

void setup(){ 
  pinMode(13, OUTPUT);
  digitalWrite(13, LOW);
  pinmode(bluetoothRx, INPUT);
  pinmode(bluetoothTx, OUTPUT);


  //You may need to modify this to suit your bluetooth module
  //This is used to initialise the bluetooth module

  blue.begin(9600);   //*************
  blue.print("\r\n+STWMOD=0\r\n"); //set the bluetooth work in slave mode
  blue.print("\r\n+STNA=SeeedBTSlave\r\n"); //set the bluetooth name as "SeeedBTSlave"
  blue.print("\r\n+STOAUT=1\r\n"); // Permit Paired device to connect me
  blue.print("\r\n+STAUTO=0\r\n"); // Auto-connection should be forbidden here
  delay(2000); // This delay is required.
  blue.print("\r\n+INQ=1\r\n"); //make the slave bluetooth inquirable 
  delay(2000); // This delay is required.
  blue.flush();
}

答案 1 :(得分:0)

您好我习惯使用来自@ScottC :)的相同代码

它的旧帖子,但也许有人会随时都有同样的问题。 问题是blue.print("\r\n+STNA=SeeedBTSlave\r\n"); //set the bluetooth name as "SeeedBTSlave" 将其更改为

blue.print("\r\n+STNA=HC-06\r\n"); //set the bluetooth name as "SeeedBTSlave"

“或更改它作为您的蓝牙设备名称。(我假设是HC-06)

答案 2 :(得分:0)

    pinmode(bluetoothRx, INPUT);
    pinmode(bluetoothTx, OUTPUT);

Capital&#34; M&#34;在pinMode中