Android + Arduino Bluetooth Передача данных

Я могу заставить приложение Android подключиться через Bluetooth к Arduino. Однако между ними не могут передаваться никакие данные. Ниже приведены мои настройки и код:

HTC Android v2.2, модем Bluetooth mate gold, 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 для скорости передачи данных, и я попытался установить контакты bluetooth rx и tx в качестве ввода / вывода и вывода / ввода. Arduino получает последовательные данные с ПК, но не может отправить его на Android (я вижу это из-за метода flashLED ()).

Android не может отправлять какие-либо данные на Arduino. Однако они оба подключены, потому что зеленый свет на модем включается и гаснет, и красный светодиод мигает, когда я закрываю соединение. Метод sendData () не генерирует исключение, потому что иначе showMessage ("SEND FAILED"); представляется.

У меня также есть это в моем манифестном .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 Bluetooth Передача данных"

Просто решил проблему для всех, кто попадал на эту страницу.

Кажется, что мне 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); } 

Я получал то же самое. Я зашел в «Настройки» -> «Беспроводные сети» -> «Настройки Bluetooth» и спарил устройство. Когда я вернулся и перезапустил свой код, он подключился, никаких исключений. Я помещаю элементы управления в свой пользовательский интерфейс для отображения сопряженных устройств, я собираюсь посмотреть, могу ли я кодировать для управления устройствами сопряжения из моего пользовательского интерфейса.

Мне удалось запустить его только после замены этого раздела:

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

Где я ввел адрес моего устройства Bluetooth. Исходный код находит устройство и возвращает правильный адрес, но mmSocket.connect (); Генерирует исключение "java.io.IOException: сбой службы обнаружен"

Предложения?

Для тех, кто находит эту страницу, но застрял с использованием жесткокодированного 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-адрес в mac.txt в корень SD-карты, тогда вы можете просто предоставить пользователям текстовый файл с их MAC-адресом, все еще позволяя приложению Быть загружен с рынка без настройки каждого экземпляра.

@Backwards_Dave просто для любопытных, попробуйте подключиться к 45 и 46 выводам и использовать этот простой код. Я использую его и не имею проблем. Вы сможете отправлять данные из Arduino Serial Monitor и читать его там.

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

Кроме того, какой щит BlueTooth вы используете для Arduino? HC-06?

РЕДАКТИРОВАТЬ

Просто протестировал его с помощью Mega2560 (не имеет 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). Refs

Надеюсь это поможет.

Я думаю, что это может быть какая-то ошибка в Bluetooth .. его лучше переустановить драйверы, так как приведенный выше код выглядит правильно.