Problema nel inviare dati di tipo int con un modulo Bluetooth HC-05

Ciao Ho usato due moduli HC-05 per collegare due Arduino, sono riuscito ad accoppiarli, ma se invio dati di tipo int superiori a 255 non riesco a leggerli, se invio 256 l'Arduino che riceve da come output 0

Ovviamente visto che è una connessione seriale e quindi trasmetti carattere a carattere (ovvero UN solo e singolo byte).

Se vuoi trasmettere qualche cosa di diverso, devi trasmettere signolarmente i vari bytes che compongono l'oggetto che vuoi trasmettere e dalla parte in cui ricevi devi rimettere assieme il tutto.

Ad esempio, un "int" è composto da DUE bytes che puoi facilmente recuperare o con le apposite funzioni che trovi nel reference lowByte() ed highByte() o utilizzando gli operatori bitWise.

Trasmetti i due bytes separati e ... chi riceve li rimette assieme ricordando che per rifare un "int" basta fare: highByte() * 256 + lowByte() .

Guglielmo

La ringrazio. Per ricevere i dati avevo pensato il seguente codice ma i valori dell'array[0] e array[1] si invertono in continuazione

codice loop di quello che invia i dati dove A0 è collegato ad un potenziometro

void loop() {
 int x=analogRead(A0);
 x=map(x,0,1023,1000,2000);
 high=(highByte(x));
 low=(lowByte(x));
 bt.write(high);
 bt.write(low);
 delay(10);
}

codice loop di quello che riceve con "i" inizializzata a 0

void loop() {
  while(bt.available()>0){
     x=bt.read();      
     array[i]=x;
     i++;
     if(i>1)
        i=0;
     Serial.print(array[0]);
     Serial.print(" ");
     Serial.println(array[1]);
     delay(10);
   }
}

Ha qualche consiglio?

Perché li metti in un array? Trasmetti due variabili (high e low) ... nello stesso ordine ricevi due variabil (prima high e poi low) e rimettile assieme. Ah, è chiaro che le due cose devono essere sincronizzate in qualche modo perché se da una parte trasmetti in continuazione, dall'altra NON sai se stai ricevendo una cosa o un altra !

Guglielmo

ok grazie mille

Sa darmi qualche consiglio su come sincronizzarle? E' tutto il pomeriggio che ci provo ma niente, questo è il codice che più si avvicina al risultato ma nel momento in cui diminuisco il delay del ricevitore già non funziona più

codice che invia i dati

void loop() {
  int x=analogRead(A0);
  x=map(x,0,1023,1000,2000);
  high=(highByte(x));
  low=(lowByte(x));
 if(bt.available()>0)
    if(bt.read()==1)
      bt.write(high);
 if(bt.available()>0)
    if(bt.read()==2)
      bt.write(low);

}

codice che li riceve

void loop() {

    bt.write(1);
   if(bt.available()>0)
    high=bt.read();

    bt.write(2);
     
    if(bt.available()>0)
    low=bt.read();

   Serial.print(high);
    Serial.print(" ");
     Serial.print(low);
     Serial.print(" ");
     Serial.println(high*256+low);
     delay(100);
}

Allora, visto che tu forzi TUTTI i valori tra 1000 e 2000 (con la map()), puoi inventarti un valore di "sincronismo", ovvero un valore che indica l'inizio della sequenza e fuori dai valori possibili (1000 .. 2000). Esempio, potresti trasmettere 0xFF poi ancora 0xFF (quindi sarebbe l'equivalente di 0xFFFF) seguito dal valore di "low" e poi di "high".

In ricezione aspetti di ricevere il 0xFF 0xFF (scarti tutto finché non li ricevi) e da quel momento i due bytes successivi che ricevi sono sicuramente il "low" ed il "high".

Ovvio che in questo modo, essendo i due processi asincroni, potrai perdere dei valori ... ad esempio tu inizi a ricevere quando il trasmettitore trasmette il "high", non sai cosa è e quindi lo butti (ed hai perso una lettura che comunque è inutilizzabile), ricevi poi 0xFF 0xFF e sai che i prossimi due sono buoni.

Guglielmo

La ringrazio finalmente ci sono riuscito, in pratica non mettevo l'istruzione flush()