Android + Arduino蓝牙数据传输

我可以让我的Android应用程序通过蓝牙连接到我的Arduino。 但是他们之间没有数据可以传输。 以下是我的设置和代码:

HTC Android v2.2,蓝牙伴侣黄金调制解调器,Arduino Mega(ATmega1280)

Android的Java代码:

package com.example.BluetoothExample; import android.app.Activity; import android.bluetooth.BluetoothAdapter; import android.bluetooth.BluetoothDevice; import android.bluetooth.BluetoothSocket; import android.content.Intent; import android.os.Bundle; import android.os.Handler; import android.view.View; import android.widget.TextView; import android.widget.EditText; import android.widget.Button; import android.widget.Toast; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.util.Set; import java.util.UUID; public class BluetoothExampleActivity extends Activity { TextView myLabel; EditText myTextbox; BluetoothAdapter mBluetoothAdapter; BluetoothSocket mmSocket; BluetoothDevice mmDevice; OutputStream mmOutputStream; InputStream mmInputStream; Thread workerThread; byte[] readBuffer; int readBufferPosition; int counter; volatile boolean stopWorker; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); Button openButton = (Button)findViewById(R.id.open); Button sendButton = (Button)findViewById(R.id.send); Button closeButton = (Button)findViewById(R.id.close); myLabel = (TextView)findViewById(R.id.label); myTextbox = (EditText)findViewById(R.id.entry); //Open Button openButton.setOnClickListener(new View.OnClickListener() { public void onClick(View v) { try { findBT(); openBT(); } catch (IOException ex) { } } }); //Send Button sendButton.setOnClickListener(new View.OnClickListener() { public void onClick(View v) { try { sendData(); } catch (IOException ex) { showMessage("SEND FAILED"); } } }); //Close button closeButton.setOnClickListener(new View.OnClickListener() { public void onClick(View v) { try { closeBT(); } catch (IOException ex) { } } }); } void findBT() { mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter(); if(mBluetoothAdapter == null) { myLabel.setText("No bluetooth adapter available"); } if(!mBluetoothAdapter.isEnabled()) { Intent enableBluetooth = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE); startActivityForResult(enableBluetooth, 0); } Set<BluetoothDevice> pairedDevices = mBluetoothAdapter.getBondedDevices(); if(pairedDevices.size() > 0) { for(BluetoothDevice device : pairedDevices) { if(device.getName().equals("FireFly-108B")) { mmDevice = device; break; } } } myLabel.setText("Bluetooth Device Found"); } void openBT() throws IOException { UUID uuid = UUID.fromString("00001101-0000-1000-8000-00805f9b34fb"); //Standard //SerialPortService ID mmSocket = mmDevice.createRfcommSocketToServiceRecord(uuid); mmSocket.connect(); mmOutputStream = mmSocket.getOutputStream(); mmInputStream = mmSocket.getInputStream(); beginListenForData(); myLabel.setText("Bluetooth Opened"); } void beginListenForData() { final Handler handler = new Handler(); final byte delimiter = 10; //This is the ASCII code for a newline character stopWorker = false; readBufferPosition = 0; readBuffer = new byte[1024]; workerThread = new Thread(new Runnable() { public void run() { while(!Thread.currentThread().isInterrupted() && !stopWorker) { try { int bytesAvailable = mmInputStream.available(); if(bytesAvailable > 0) { byte[] packetBytes = new byte[bytesAvailable]; mmInputStream.read(packetBytes); for(int i=0;i<bytesAvailable;i++) { byte b = packetBytes[i]; if(b == delimiter) { byte[] encodedBytes = new byte[readBufferPosition]; System.arraycopy(readBuffer, 0, encodedBytes, 0, encodedBytes.length); final String data = new String(encodedBytes, "US-ASCII"); readBufferPosition = 0; handler.post(new Runnable() { public void run() { myLabel.setText(data); } }); } else { readBuffer[readBufferPosition++] = b; } } } } catch (IOException ex) { stopWorker = true; } } } }); workerThread.start(); } void sendData() throws IOException { String msg = myTextbox.getText().toString(); msg += "\n"; //mmOutputStream.write(msg.getBytes()); mmOutputStream.write('A'); myLabel.setText("Data Sent"); } void closeBT() throws IOException { stopWorker = true; mmOutputStream.close(); mmInputStream.close(); mmSocket.close(); myLabel.setText("Bluetooth Closed"); } private void showMessage(String theMsg) { Toast msg = Toast.makeText(getBaseContext(), theMsg, (Toast.LENGTH_LONG)/160); msg.show(); } } 

Arduino代码:

 #include <SoftwareSerial.h> int bluetoothTx = 45; int bluetoothRx = 47; SoftwareSerial bluetooth(bluetoothTx, bluetoothRx); void setup() { //pinMode(45, OUTPUT); //pinMode(47, INPUT); pinMode(53, OUTPUT); //Setup usb serial connection to computer Serial.begin(9600); //Setup Bluetooth serial connection to android bluetooth.begin(115200); bluetooth.print("$$$"); delay(100); bluetooth.println("U,9600,N"); bluetooth.begin(9600); } void loop() { //Read from bluetooth and write to usb serial if(bluetooth.available()) { char toSend = (char)bluetooth.read(); Serial.print(toSend); flashLED(); } //Read from usb serial to bluetooth if(Serial.available()) { char toSend = (char)Serial.read(); bluetooth.print(toSend); flashLED(); } } void flashLED() { digitalWrite(53, HIGH); delay(500); digitalWrite(53, LOW); } 

我试过使用115200和9600的波特率,我试着将蓝牙rx和tx引脚设置为input/输出和输出/input。 Arduino正在从PC接收串行数据,但无法将其发送给Android(由于flashLED()方法,我可以看到这一点)。

Android无法向Arduino发送任何数据。 然而,他们都连接,因为调制解调器上的绿灯亮起和熄灭,当我closures连接红灯led闪烁。 sendData()方法不抛出exception,否则showMessage(“SEND FAILED”); 会出现。

我也有我的manifest .xml中的这个

 <uses-permission android:name="android.permission.BLUETOOTH" /> <uses-sdk android:minSdkVersion="8" android:targetSdkVersion="8" /> 

任何帮助将不胜感激!

代码取自:

http://bellcode.wordpress.com/2012/01/02/android-and-arduino-bluetooth-communication/

Solutions Collecting From Web of "Android + Arduino蓝牙数据传输"

刚刚解决了谁遇到这个网页的其他人的问题。

似乎我的Arduino不喜欢使用数字引脚进行串行通信,我使用的是TX和RX,代码是取自http://jondontdoit.blogspot.com.au/2011/11/bluetooth-mate-tutorial.html ,也似乎9600是一个很好的波特而不是115200。

 /*********************** Bluetooth test program ***********************/ //TODO //TEST THIS PROGRAM WITH ANDROID, //CHANGE PINS TO RX AND TX THO ON THE ARDUINO! //int counter = 0; int incomingByte; void setup() { pinMode(53, OUTPUT); Serial.begin(9600); } void loop() { // see if there's incoming serial data: if (Serial.available() > 0) { // read the oldest byte in the serial buffer: incomingByte = Serial.read(); // if it's a capital R, reset the counter if (incomingByte == 'g') { digitalWrite(53, HIGH); delay(500); digitalWrite(53, LOW); delay(500); //Serial.println("RESET"); //counter=0; } } //Serial.println(counter); //counter++; //delay(250); } 

我得到了同样的东西。 我进入“设置” – >“无线和networking” – >“蓝牙设置”,并配对设备。 当我回去,重新运行我的代码,它连接,没有例外。 我把控制在我的用户界面显示配对的设备,我要看看我能否代码来pipe理我的用户界面的配对设备。

我能够得到这个只有在更换本节后才能运行:

 Set<BluetoothDevice> pairedDevices = BluetoothAdapter.getBondedDevices(); if(pairedDevices.size() > 0) { for(BluetoothDevice device : pairedDevices) { if(device.getName().startsWith("FireFly-")) { mmDevice = device; Log.d("ArduinoBT", "findBT found device named " + mmDevice.getName()); Log.d("ArduinoBT", "device address is " + mmDevice.getAddress()); break; } } } 

有了这个:

  Set<BluetoothDevice> pairedDevices = mBluetoothAdapter.getBondedDevices(); mmDevice = mBluetoothAdapter.getRemoteDevice("00:06:66:46:5A:91"); if (pairedDevices.contains(mmDevice)) { statusText.setText("Bluetooth Device Found, address: " + mmDevice.getAddress() ); Log.d("ArduinoBT", "BT is paired"); } 

在那里我input了我的蓝牙设备的地址。 原始代码find设备并返回正确的地址,但是mmSocket.connect(); 生成一个exception“java.io.IOException:服务发现失败”

build议?

对于任何人发现这个页面,但坚持使用上面的硬编码MAC地址,将MAC地址设置为NULL,并将此代码插入到OnResume()

 try{ File f = new File(Environment.getExternalStorageDirectory()+"/mac.txt"); FileInputStream fileIS = new FileInputStream(f); buf = new BufferedReader(new InputStreamReader(fileIS)); String readString = new String(); while((readString = buf.readLine())!= null){ address = readString; } } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e){ e.printStackTrace(); } 

另外,不要忘记让eclipse包含必要的库,并将你的mac地址放在SD卡的根目录mac.txt中,然后你可以简单地给用户一个带有mac地址的文本文件,同时仍然允许app无需定制每个实例即可从市场下载。

@Backwards_Dave只是一个好奇,尝试连接到45和46引脚,并使用这个简单的代码。 我用它,没有问题。 您将能够从Arduino串行监视器发送数据,并在那里读取。

 /* Pinout: 45 --> BT module Tx 46 --> BT module Rx */ #include <SoftwareSerial.h> SoftwareSerial mySerial(45, 46); // RX, TX void setup() { // Open serial communications and wait for port to open: Serial.begin(9600); Serial.println("I am ready to send some stuff!"); // set the data rate for the SoftwareSerial port mySerial.begin(9600); } void loop() // run over and over { if (mySerial.available()) Serial.write(mySerial.read()); if (Serial.available()) mySerial.write(Serial.read()); } 

另外,Arduino使用了什么BlueTooth盾牌? HC-06?

编辑

用Mega2560testing(没有1280),没有问题。

我相信问题是与引脚。

等待你的反馈

如果您仍然在寻找答案,请尝试更改软件串行引脚。 这是您正在使用的库的一个众所周知的限制。

并非所有Mega支持引脚都会改变中断,所以RX只能使用以下内容:10,11,12,13,14,15,50,51,52,53,A8(62),A9(63), A10(64),A11(65),A12(66),A13(67),A14(68),A15(69)。 参考文献

希望这可以帮助。

我认为这可能是一些蓝牙故障..最好重新安装其驱动程序..因为上面给出的代码看起来是正确的。