Ciao ragazzi Ho un problema con Arduino e seedstudio bluetooth shield. Ho creato un app tramite AppInventor che deve inviare dei comandi ad arduino. Esso li deve eseguire e poi reinvia al bluetooth una risposta. Con appinventor ho vari modi per inviare dei comandi: Send1ByteNumber, Send2ByteNumber, Send4ByteNumber, SendBytes e SendText..
E posso ricevere dei dati tramite questi comandi: ReceiveSigned1ByteNumber, ReceiveSigned2ByteNumber, ReceiveSigned4ByteNumber, ReceiveSignedBytes, ReceiveText, ReceiveUnsigned1ByteNumber, ReceiveUnsigned2ByteNumber, ReceiveUnsigned4ByteNumber..
In questo modo controllo se ci sono scambi di dati..
I comandi che vorrei inviare tramite l'app sono dei semplici testi (non numeri): curva_dx, curva_sx, avanti, indietro.
I comandi che ricevo tramite bluetooth invece sono sia testo che numeri: motore_in_movimento, motore_fermo, 36.4, 23.2
Come posso fare? Con char non posso confrontare un testo.
Esempio:
if(blueToothSerial.available()){
recvChar = blueToothSerial.read();
Serial.print(recvChar);
if (recvChar == "curva_dx"){
//Curva a destra
}
}
Ho cercato altre soluzioni ma senza riuscirci =( Inoltre la soluzione 1 ha un problema. Quando il cellulare si collega al modulo del bluetooth, esso invia sulla seriale del bluetooth (blueToothSerial) lo stato del modulo (ad esempio se si è connesso, se si è disconnesso ecc..) quindi può capitare che questi byte possano interagire con lo switch(comando) e di conseguenza causare un problema.
Se proprio vuoi/devi usare la classe String (che, ti preannuncio, a seconda di come la usi, ti potrà dare problemi ed errori difficilmente diagnosticabili ... per esaurimento della SRAM), prova anche a guardare le altre funzioni della classe Serial ...
... tipo la readBytes() o la readBytesUntil(). Io le sconsiglio sempre, sono altamente diseducative e non ti insegnano nulla su come si gestisce una comunicazione seriale, però ... se vuoi la "pappa fatta" ... con i loro limiti, quelle dovrebbero andarti bene :~
La classe String la userei come da esempio, ovvero leggere tutti i caratteri nella seriale finchè non trovo il nome di un comando. A quel punto eseguo il comando e resetto la stringa. Avrei problemi con la SRAM?
In un altro posto ho notato che utilizzi pure tu l'HC-05: tu che metodo utilizzi per inviare e ricevedere dei dati/informazioni?
utentespastico:
La classe String la userei come da esempio, ovvero leggere tutti i caratteri nella seriale finchè non trovo il nome di un comando. A quel punto eseguo il comando e resetto la stringa. Avrei problemi con la SRAM?
Di sicuro ... ]
Purtroppo sei su una MCU e non c'è un sistema operativo che fa "garbage-collection" ... quindi ...
... ogni volta che cambi la lunghezza della stringa viene fatto un dealloc() e un realloc() ... creando facilmente buchi nella memoria sino all'esaurimento !
utentespastico:
In un altro posto ho notato che utilizzi pure tu l'HC-05: tu che metodo utilizzi per inviare e ricevedere dei dati/informazioni?
Lavoro con le stringhe di tipo "char array" (null terminated) e le funzioni di string.h ...
... come già ti ho detto ...
gpb01:
Purtroppo sei su una MCU e non c'è un sistema operativo che fa "garbage-collection" ... quindi ...
... ogni volta che cambi la lunghezza della stringa viene fatto un dealloc() e un realloc() ... creando facilmente buchi nella memoria sino all'esaurimento !
L'ATmega328 ha 2kb di SRAM. Penso che sia sufficiente per eseguire almeno 30 volte il comando.. Oppure potrei spedire un singolo byte cercando di inviare byte che non possano interferire con l'invio di informazioni da parte del modulo BT e poi leggerlo tranquillamente..
gpb01:
Lavoro con le stringhe di tipo "char array" (null terminated) e le funzioni di string.h ...
... come già ti ho detto ...
utentespastico:
L'ATmega328 ha 2kb di SRAM. Penso che sia sufficiente per eseguire almeno 30 volte il comando...
Non è detto ...
... un sistema per limitare i danni è inizialmente allocare subito il massimo spazio occorrente (... anche con una stringa piena di spazi), così, se la ridimensioni, no deve allocarne altro.
utentespastico:
Potresti postare un banalissimo esempio?
Guada, ne avrò postati sul forum un'infinità ... se fai una ricerca trovi vari esempi ... anche perché dipende cosa devi esattamente leggere.
Un conto è, ad esempio, leggere un numero fisso di caratteri, un altro è leggere caratteri sino all'arrivo di un certo carattere (... tipicamente il CR), un altro è tenere conto di eventuali timeout ... insomma la casistica è varia, anche se alla fine è sempre un WHILE che gira finché non si verifica una delle suddette condizioni ...
Piuttosto ... ti sei letto le varie pagine di QUESTO thread dedicato proprio all'uso dei moduli BT ?
Grazie per il codice anche se avevo trovato questo:
char inData[20]; // Allocate some space for the string
char inChar=-1; // Where to store the character read
byte index = 0; // Index into array; where to store the character
void setup(){
Serial.begin(9600);
Serial.println("Power On");
}
char Comp(char* This){
while(Serial.available() > 0) // Don't read unless
// there you know there is data
{
if(index < 19) // One less than the size of the array
{
inChar = Serial.read(); // Read a character
inData[index] = inChar; // Store it
index++; // Increment where to write next
inData[index] = '\0'; // Null terminate the string
}
}
if(strcmp(inData,This) == 0){
for(int i=0;i<19;i++){
inData[i]=0;
}
index=0;
return(0);
}
else{
return(1);
}
}
void loop()
{
if(Comp("m1 on")==0){
Serial.write("Motor 1 -> Online\n");
}
if(Comp("m1 off")==0){
Serial.write("Motor 1 -> Offline\n");
}
}
Il problema è che se leggo una scritta diversa, non riesco più a leggere nessuna stringa. Devo mettere un controllo: ad esempio cercando un carattere prima e dopo la stringa (#m1 on!)..
Come faccio ad evitare che il modulo bluetooth scriva di default sulla seriale bluetooth alcune sue informazioni quali il suo stato, se è connesso, se è disconnesso, ecc..?
#include <SoftwareSerial.h>
#define RxD 6
#define TxD 7
SoftwareSerial blueToothSerial(RxD,TxD);
void setup(){
Serial.begin(9600);
pinMode(RxD, INPUT);
pinMode(TxD, OUTPUT);
setupBlueToothConnection();
}
void setupBlueToothConnection(){
blueToothSerial.begin(38400); //Set BluetoothBee BaudRate to default baud rate 38400
blueToothSerial.print("\r\n+STWMOD=0\r\n"); //set the bluetooth work in slave mode
blueToothSerial.print("\r\n+STNA=SeeedBTSlave\r\n"); //set the bluetooth name as "SeeedBTSlave"
blueToothSerial.print("\r\n+STOAUT=1\r\n"); // Permit Paired device to connect me
blueToothSerial.print("\r\n+STAUTO=0\r\n"); // Auto-connection should be forbidden here
delay(2000); // This delay is required.
blueToothSerial.print("\r\n+INQ=1\r\n"); //make the slave bluetooth inquirable
Serial.println("The slave bluetooth is inquirable!");
delay(2000); // This delay is required.
blueToothSerial.flush();
}
Gli HC-05 non rompono le scatole con tutte quelle indicazioni (salvo se non sei MASTER), se vuoi vai a chiedergliele, ma normalmente ti passano quello che ricevono e trasmettono quello che gli mandi XD XD XD
Per quale motivo se invio un carattere (o anche una stringa) il modulo bluetooth si avvia correttamente e diventa rilevabile ma subito dopo non funziona più?