Autore Topic: ricevere 2 floats da ble con RFduino  (Letto 952 volte)

Offline TMSio

  • Nuovo arrivato
  • *
  • Post: 5
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    s4 mini
ricevere 2 floats da ble con RFduino
« il: 18 Dicembre 2015, 11:03:36 CET »
0
Salve, uso un rfduino per ricevere 2 floats (temperatura in C° e F°).
Con IOS non ho problemi le vedo tutte e due in maniera corretta.
Con Android riesco a vederne solo una.... non capisco come accorpare la serie di 4 bytes in 2 valori e poi convertirli da little endian in  2 floats
Il codice RFduino è il seguente:loop every second
Loop
{
.......
..........
..............
RFduinoBLE.sendFloat (c);
RFduinoBLE.sendFloat (f);
}

Il mio codice java:

 else if (BluetoothLeService.ACTION_DATA_AVAILABLE.equals(action)) {
               
                byte[] data = intent.getByteArrayExtra(BluetoothLeService.EXTRA_DATA);
                float Sensor1 = ByteBuffer.wrap(data).order(ByteOrder.LITTLE_ENDIAN).getFloat();
                temp_C.setText(Integer.toString((int) Sensor1 ) + "C");

Qualcuno mi può aiutare?

Grazie anticipatamente.
Saluti
Emiliano

Offline bradipao

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 4043
  • keep it simple
  • Respect: +567
    • Github
    • Google+
    • bradipao
    • Mostra profilo
  • Dispositivo Android:
    Nexus 5
  • Play Store ID:
    Bradipao
  • Sistema operativo:
    W7
Re:ricevere 2 floats da ble con RFduino
« Risposta #1 il: 18 Dicembre 2015, 11:30:05 CET »
0
A meno che mi sfugga qualcosa, 4 bytes sono UN SOLO float, non due.

Puoi facilmente controllare verificare la lunghezza dei dati caricati nel buffer "data", che dovrebbe essere 8 bytes. A quel punto ti dovrebbe bastare ripetere due volte il codice che hai copiato.
NON rispondo a domande nei messaggi privati
Bradipao @ Play Store

Offline TMSio

  • Nuovo arrivato
  • *
  • Post: 5
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    s4 mini
Re:ricevere 2 floats da ble con RFduino
« Risposta #2 il: 18 Dicembre 2015, 12:06:21 CET »
0
Si, facile che mi sono spiegato male io....   :-P

Intendi una cosa del genere, scusa può capitare che faccia domande stupide... ma è da poco che mi cimento in cose del genere.

 else if (BluetoothLeService.ACTION_DATA_AVAILABLE.equals(action)) {
               
                byte[] data = intent.getByteArrayExtra(BluetoothLeService.EXTRA_DATA);
                float Sensor1 = ByteBuffer.wrap(data).order(ByteOrder.LITTLE_ENDIAN).getFloat();
                temp_C.setText(Integer.toString((int) Sensor1 ) + "C");

                byte[] data = intent.getByteArrayExtra(BluetoothLeService.EXTRA_DATA);
                float Sensor2 = ByteBuffer.wrap(data).order(ByteOrder.LITTLE_ENDIAN).getFloat();
                temp_F.setText(Integer.toString((int) Sensor2 ) + "F");





Offline iceweasel

  • Moderatore globale
  • Utente senior
  • *****
  • Post: 878
  • Respect: +147
    • Mostra profilo
  • Dispositivo Android:
    LGE P990 - Google Nexus 5
  • Sistema operativo:
    Linux Debian Sid
Re:ricevere 2 floats da ble con RFduino
« Risposta #3 il: 18 Dicembre 2015, 12:38:38 CET »
0
Controlla se l'array di byte ricevuto è di 4 byte per ogni singolo float point.

Controlla se i dati inviati sono veramente little-endian.

Invii un float point a 32 bit (credo nel formato IEEE 754) per poi convertirlo in un intero? Mi sembra una esagerazione e una complicazione inutile, basta un byte segnato di 8 bit per inviare una temperatura compresa tra -128 e +127.

Le norme internazionali sulla notazione delle unità di misura per i gradi
Celsius indicano la notazione  "°C", l'uso della sola lette a "C" è sbagliato.



Inviato dal mio Nexus 5 utilizzando Tapatalk

adb logcat | tee /tmp/logcat | grep TAG

Offline TMSio

  • Nuovo arrivato
  • *
  • Post: 5
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    s4 mini
Re:ricevere 2 floats da ble con RFduino
« Risposta #4 il: 18 Dicembre 2015, 13:17:00 CET »
0
Andiamo un pò sul complicato... :(
Non posso modificare la modalità di invio... poichè questo codice funziona con IOS e parzialmente su android... non vorrei cambiarlo per non imbattermi in ulteriori problemi.

Offline bradipao

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 4043
  • keep it simple
  • Respect: +567
    • Github
    • Google+
    • bradipao
    • Mostra profilo
  • Dispositivo Android:
    Nexus 5
  • Play Store ID:
    Bradipao
  • Sistema operativo:
    W7
Re:ricevere 2 floats da ble con RFduino
« Risposta #5 il: 18 Dicembre 2015, 13:34:01 CET »
0
Ammesso (come dice iceweasel) che i dati siano float a 4 bytes ciascuno in little endian, cosa che sembra essere confermata da qualche post su RFduino che ho trovato su google, secondo me dentro data ci sono tutti e 8 i bytes dei due float.

Prova a visualizzare tutto l'array "data" (ad esempio nel LogCat) e se confermato dovrebbe bastare isolare i due gruppi di 4 bytes.
NON rispondo a domande nei messaggi privati
Bradipao @ Play Store

Offline TMSio

  • Nuovo arrivato
  • *
  • Post: 5
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    s4 mini
Re:ricevere 2 floats da ble con RFduino
« Risposta #6 il: 18 Dicembre 2015, 14:03:13 CET »
0
La modifica che ho postato pensata che possa andar bene?
Questa sera a casa vorrei provare....
Che dite può funzionare?

Offline bradipao

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 4043
  • keep it simple
  • Respect: +567
    • Github
    • Google+
    • bradipao
    • Mostra profilo
  • Dispositivo Android:
    Nexus 5
  • Play Store ID:
    Bradipao
  • Sistema operativo:
    W7
Re:ricevere 2 floats da ble con RFduino
« Risposta #7 il: 18 Dicembre 2015, 14:38:48 CET »
0
Quello che intendevo io è questo (scritto molto rozzamente in quasi-pseudocodice):


Codice (Java): [Seleziona]
byte[] data = intent.getByteArrayExtra(BluetoothLeService.EXTRA_DATA);

if (data.length>=4) {
   byte[] data1 = Arrays.copyOfRange(data,0,3);
   float Sensor1 = ByteBuffer.wrap(data1).order(ByteOrder.LITTLE_ENDIAN).getFloat();
   temp_C.setText(Integer.toString((int) Sensor1 ) + "C");
}

if (data.length>=8) {
   byte[] data2 = Arrays.copyOfRange(data,4,7);
   float Sensor2 = ByteBuffer.wrap(data2).order(ByteOrder.LITTLE_ENDIAN).getFloat();
   temp_F.setText(Integer.toString((int) Sensor2 ) + "F");
}
NON rispondo a domande nei messaggi privati
Bradipao @ Play Store

Offline TMSio

  • Nuovo arrivato
  • *
  • Post: 5
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    s4 mini
Re:ricevere 2 floats da ble con RFduino
« Risposta #8 il: 20 Dicembre 2015, 18:13:10 CET »
0
Ciao, il problema sembra più articolato ho messo questo codice per vedere la lunghezza dei bytes che arrivano:
int Sensor1 = data.length;
temp_C.setText(Integer.toString((int) Sensor1 ) + "C");

E mi arriva il valore 4 quindi non legge gli altri 4 bytes del secondo valore...
Forse c è qualche errore nell invio?
Se si perchè IOS li legge perfettamente?
Qualsiasi idea è ben accetta...

Grazie in anticipo.

Offline bradipao

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 4043
  • keep it simple
  • Respect: +567
    • Github
    • Google+
    • bradipao
    • Mostra profilo
  • Dispositivo Android:
    Nexus 5
  • Play Store ID:
    Bradipao
  • Sistema operativo:
    W7
Re:ricevere 2 floats da ble con RFduino
« Risposta #9 il: 21 Dicembre 2015, 08:11:06 CET »
0
Forse l'invio di 4bytes è in un certo senso immediato, ma per i successivi ci vuole un po'.
E quando scatta la prima volta DATA_AVAILABLE, sono arrivati solo i primi 4.
Forse è previsto che passi due volte dentro la routine di dati disponibili.
NON rispondo a domande nei messaggi privati
Bradipao @ Play Store