Recevoir des données à partir d'Arduino bluetooth de l'appareil
J'ai suivi cet exemple: http://english.cxem.net/arduino/arduino5.php
J'ai un arduino uno conseil d'administration mis en place avec un sparkfun périphérique bluetooth. Je peux me connecter et d'envoyer des données à partir de android à l'arduino et je le vois de données de pop up dans la série du moniteur, mais je ne peux pas envoyer des données à partir de l'arduino(moniteur de série) et le retour à Android.
Je suis à l'aide d'un ConnectThread qui est commencé dans la méthode onResume dans l'activité. C'est le code de mon 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) { }
}
}
Ai-je besoin d'utiliser un service qui attend toujours les données depuis le moniteur de série se contente d'envoyer les données lorsque j'appuie sur envoyer?
EDIT: code Arduino:
#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!
}
- Salut oivindth, j'ai aussi été confronté au même problème que le vôtre et j'arrive aussi à se référer à la même source que vous avez. Vous avez mentionné que vous résolu ce problème à l'aide d'un Looper.préparer dans le fil, pourriez-vous expliquer un peu plus, ou elle serait génial si vous pouviez mettre à jour votre solution sur les codes ci-dessus. Merci un tas.
- Salut @NicholasTJ. J'ai simplement ajouté un Looper.prepare(); dans ma méthode Run (). Si cette doesen " l'aide que je peux mettre à jour le post avec le code.
- Je l'ai eu en cours d'exécution, mais pas avec un Looper.prepare(), eh bien, je pense que j'ai eu à le regarder dans Looper.prepare() et voir ce qu'il fait. Mais si vous êtes ok avec moi paresseuse, une mise à jour sur votre code dans votre post serait génial.
- merci pour le lien.
Vous devez vous connecter pour publier un commentaire.
Non, vous n'avez pas besoin d'un service, d'un thread devrait fonctionner correctement. Ce code est pratiquement identique au code fourni dans la BluetoothChat échantillon fournissez par l'intermédiaire du kit SDK d'Android, donc ça devrait marcher.
En utilisant le moniteur de série, vous envoyez des données à l'Arduino, donc je suppose que vous êtes en écho à celle des données de l'arrière à l'aide de Série.println("chaîne") ou quelque chose de similaire. Cependant, depuis que vous avez suivi l'article que vous avez cité, vous avez la puce Bluetooth relié à la RX/TX broches (0 et 1) sur l'Arduino, qui est la même broches utilisé par le Moniteur de Série. J'ai constaté que lorsque la puce Bluetooth est relié à ceux-ci, la série du moniteur reçoit encore des données mais ne peut plus envoyer. Si votre problème est sur l'Arduino côté.
Aussi, ce StackOverflow répondre mentionne que vous ne pouvez pas utiliser à la fois le Moniteur de Série et Bluetooth sur les broches 0 et 1 en même temps.
Si vous voulez toujours utiliser le Moniteur de Série, le raccordement de la puce Bluetooth pour différentes broches numériques et l'utilisation de la SoftwareSerial Arduino bibliothèque comme décrit ici.
J'ai fait une simple modification du Bluetooth Chat exemple comme décrit dans ce post et mon Android n'a pas de problème de réception de l'Arduino.