Empfangen von Daten von Arduino bluetooth-Gerät
Habe ich diesem Beispiel gefolgt: http://english.cxem.net/arduino/arduino5.php
Ich habe ein arduino uno board mit einem sparkfun bluetooth-Gerät. Ich kann verbinden und senden von Daten von android zu arduino und ich die Daten sehen pop-up in den serial monitor, aber ich kann nicht senden Sie die Daten vom arduino(serial monitor) und zurück zu Android.
Ich bin mit einem ConnectThread gestartet wird in der onResume-Methode der activity. Dies ist der code für meinen thread:
private class ConnectedThread extends Thread {
private final BluetoothSocket mmSocket;
private final InputStream mmInStream;
private final OutputStream mmOutStream;
public ConnectedThread(BluetoothSocket socket) {
Log.d("THREAD", "constructor");
mmSocket = socket;
InputStream tmpIn = null;
OutputStream tmpOut = null;
//Get the input and output streams, using temp objects because
//member streams are final
try {
tmpIn = socket.getInputStream();
tmpOut = socket.getOutputStream();
} catch (IOException e) { }
mmInStream = tmpIn;
mmOutStream = tmpOut;
}
public void run() {
Log.d("THREAD", "inside run" );
byte[] buffer = new byte[256]; //buffer store for the stream
int bytes; //bytes returned from read()
//Keep listening to the InputStream until an exception occurs
while (true) {
Log.d("in loop", "waiting for data");
try {
//Read from the InputStream
bytes = mmInStream.read(buffer); //Get number of bytes and message in "buffer"
h.obtainMessage(RECIEVE_MESSAGE, bytes, -1, buffer).sendToTarget(); //Send to message queue Handler
Log.d("recieve", "b " + bytes);
} catch (IOException e) {
break;
}
}
}
/* Call this from the main activity to send data to the remote device */
public void write(String message) {
Log.d("TAG", "...Data to send: " + message + "...");
byte[] msgBuffer = message.getBytes();
try {
mmOutStream.write(msgBuffer);
} catch (IOException e) {
Log.d("TAG", "...Error data send: " + e.getMessage() + "...");
}
}
/* Call this from the main activity to shutdown the connection */
public void cancel() {
try {
mmSocket.close();
} catch (IOException e) { }
}
}
Benötige ich einen service, der immer wartet, bis Daten, da der serielle monitor nur Daten senden, wenn ich drücken Sie senden?
EDIT: Arduino-code:
#include <SoftwareSerial.h>
int bluetoothTx = 2; //TX-O pin of bluetooth mate, Arduino D2
int bluetoothRx = 3; //RX-I pin of bluetooth mate, Arduino D3
SoftwareSerial bluetooth(bluetoothTx, bluetoothRx);
void setup()
{
Serial.begin(9600); //Begin the serial monitor at 9600bps
bluetooth.begin(115200); //The Bluetooth Mate defaults to 115200bps
bluetooth.print("$$$"); //Enter command mode
delay(100); //Short delay, wait for the Mate to send back CMD
bluetooth.println("U,9600,N"); //Temporarily Change the baudrate to 9600, no parity
//115200 can be too fast at times for NewSoftSerial to relay the data reliably
bluetooth.begin(9600); //Start bluetooth serial at 9600
}
void loop()
{
if(bluetooth.available()) //If the bluetooth sent any characters
{
//Send any characters the bluetooth prints to the serial monitor
Serial.print((char)bluetooth.read());
}
if(Serial.available()) //If stuff was typed in the serial monitor
{
char c = (char) Serial.read();
//Send any characters the Serial monitor prints to the bluetooth
bluetooth.print(c);
}
//and loop forever and ever!
}
- Hi oivindth, auch ich Stand vor dem ähnlichen problem wie deins und ich zufällig auch beziehen sich auf die gleiche Quelle wie die, die Sie haben. Sie haben erwähnt, Sie lösten dieses Problem mit einem Looper.bereiten Sie in den thread, könnten Sie bitte erklären, ein wenig mehr oder es wäre toll, wenn könnten Sie aktualisieren Sie Ihre Lösung auf die codes oben. Dank einem Haufen.
- Hi @NicholasTJ. Added mich einfach Looper.prepare(); in meiner Run () - Methode. Wenn diese doesen ' T helfen, ich kann update-post mit code.
- Ich habe es ausgeführt, aber nicht mit Looper.prepare(), na gut, ich glaube, ich habe einen Blick in "Looper".prepare() und sehen, was es tut. Aber, wenn Sie sind ok mit mir faul sein, ein update auf deinen code in deinem post wäre toll.
- danke für den link.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Nein, Sie müssen nicht einen Dienst, ein thread sollte funktionieren. Dieser code ist nahezu identisch mit dem code in der BluetoothChat-Beispiel über das Android SDK, damit sollte es funktionieren.
Durch die Verwendung der seriellen monitor, die Sie senden Daten auf den Arduino, so dass ich nehme an, Sie sind echo-Daten zurück, die über ein Serielles.println("Datenstring") oder etwas ähnliches. Jedoch, da Sie nach dem Artikel, den Sie zitiert haben, haben Sie die Bluetooth-chip angeschlossen an die RX/TX pins (0 und 1) auf dem Arduino, das die gleichen pins verwendet, die durch den Serial Monitor. Ich habe festgestellt, dass, wenn die Bluetooth-chip angeschlossen wird, bis auf diese, den serial monitor immer noch Daten empfängt, aber nicht mehr senden. Also dein problem ist auf der Arduino-Seite.
Auch diese StackOverflow-Antwort erwähnt, dass Sie nicht verwenden können, sowohl den Seriellen Monitor und Bluetooth an den pins 0 und 1 zur gleichen Zeit.
Wenn Sie trotzdem möchten, verwenden Sie den Seriellen Monitor -, Haken-Bluetooth-chip, um verschiedene digitale Stifte und verwenden Sie die Arduino-SoftwareSerial-Bibliothek, wie beschrieben,hier.
Habe ich eine einfache änderung der Bluetooth-Chat-sample wie beschrieben in dieser Beitrag und mein Android hat kein problem, der Empfang aus dem Arduino.