Autore Topic: Ricezione bluetooth  (Letto 561 volte)

Offline davix10

  • Utente normale
  • ***
  • Post: 159
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Lg G4
  • Play Store ID:
    davix10
  • Sistema operativo:
    Windows 10
Ricezione bluetooth
« il: 10 Febbraio 2015, 12:28:35 CET »
0
Salve a tutti, volevo sapere come mai non riesco a ricevere da bluetooth un byte che arriva circa 1000 volte al secondo. Ho provato in tutti i modi ma non riesco proprio! Qualcuno mi può dare qualche consiglio? Ho provato praticamente tutte le librerie ma nessuna mi ha dato i risultati sperati. Grazie in anticipo!  :-)

EDIT
Il dato lo ricevo ma perdo molti campioni

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:Ricezione bluetooth
« Risposta #1 il: 10 Febbraio 2015, 13:38:18 CET »
0
E' abbastanza normale che tu non riesca a leggere un byte ogni millisecondo, mentre per esempio dovresti riuscire a leggerne un milione di byte ogni secondo.

Fai accumulare i byte nel buffer e vai a leggerli ad esempio 100 alla volta.
NON rispondo a domande nei messaggi privati
Bradipao @ Play Store

Offline davix10

  • Utente normale
  • ***
  • Post: 159
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Lg G4
  • Play Store ID:
    davix10
  • Sistema operativo:
    Windows 10
Re:Ricezione bluetooth
« Risposta #2 il: 10 Febbraio 2015, 17:52:36 CET »
0
E' abbastanza normale che tu non riesca a leggere un byte ogni millisecondo, mentre per esempio dovresti riuscire a leggerne un milione di byte ogni secondo.

Fai accumulare i byte nel buffer e vai a leggerli ad esempio 100 alla volta.

Questo è il mio codice, come devo modificarlo?
Codice (Java): [Seleziona]
case MESSAGE_READ:
                                byte[] readBuf = (byte[]) msg.obj;

                               
                                da++;

                               String str20 = String.valueOf(da);

                               
                               mConversationArrayAdapter.add(str20);
                                if(da==100)
                                {
                                        mConversationArrayAdapter.add("ARRIVO");
                                       
                                }
                                break;

Offline davix10

  • Utente normale
  • ***
  • Post: 159
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Lg G4
  • Play Store ID:
    davix10
  • Sistema operativo:
    Windows 10
Re:Ricezione bluetooth
« Risposta #3 il: 12 Febbraio 2015, 10:04:01 CET »
0
Sono riuscito a ricevere tutti i campioni diminuendo la capienza del buffer da 1024 (di default) a 1. Come è possibile?


EDIT
Entra nel case READ il numero di volte corretto ma i dati che riceve sono sbagliati. Molte volte ripete lo stesso numero e non capisco il motivo.
« Ultima modifica: 12 Febbraio 2015, 10:26:07 CET da davix10 »

Offline davix10

  • Utente normale
  • ***
  • Post: 159
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Lg G4
  • Play Store ID:
    davix10
  • Sistema operativo:
    Windows 10
Re:Ricezione bluetooth
« Risposta #4 il: 16 Febbraio 2015, 12:13:00 CET »
0
Non riesco a trovare una soluzione, nessuno può aiutarmi?

Offline davix10

  • Utente normale
  • ***
  • Post: 159
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Lg G4
  • Play Store ID:
    davix10
  • Sistema operativo:
    Windows 10
Re:Ricezione bluetooth
« Risposta #5 il: 04 Marzo 2015, 12:55:06 CET »
0
Ho provato a cambiare la comunicazione, ora invio 8 byte ogni 30 ms ma ogni tanto in modo a volte casuale a volte sistematico ricevo dei byte invertiti.

Questa è la parte del Bluetooth:

Codice (Java): [Seleziona]
while (true) {
                try {
                        try {
                                                sleep(30);  
                                        } catch (InterruptedException e) {
                                                // TODO Auto-generated catch block
                                                e.printStackTrace();
                                        }

                    buffer = new byte[16];
                    // Read from the InputStream
                    bytes = mmInStream.read(buffer);

                    // Send the obtained bytes to the UI activity
                    mHandler.obtainMessage(MESSAGE_READ, bytes, -1, buffer).sendToTarget();


                } catch (IOException e) {
                    break;
                }
            }

e questo è l'Handler nella mainActivity:

Codice (Java): [Seleziona]
case Bluetooth.MESSAGE_READ:

                    if (msg.obj != null) {
                        byte[] readBuf = (byte[]) msg.obj;


                        valore_a_16 = ((readBuf[1] & 0xFF) << 8) | (readBuf[0] & 0xFF);
                        valore_a_16_2 = ((readBuf[3] & 0xFF) << 8) | (readBuf[2] & 0xFF);
                        valore_a_16_3 = ((readBuf[5] & 0xFF) << 8) | (readBuf[4] & 0xFF);
                        valore_a_16_4 = ((readBuf[7] & 0xFF) << 8) | (readBuf[6] & 0xFF);
                   

Sto impazzendo senza trovare una soluzione! Aiuto!
« Ultima modifica: 04 Marzo 2015, 16:01:47 CET da davix10 »

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:Ricezione bluetooth
« Risposta #6 il: 04 Marzo 2015, 13:30:52 CET »
0
Che arrivino invertiti è improbabile, sarebbe un grave bug nel bluetooth (che escluderei).

E' più probabile che un byte di un gruppo venga ricevuto in testa al gruppo successivo, facendo così apparire i byte invertiti. Lo stai facendo il controllo del numero di bytes letti ogni volta?
NON rispondo a domande nei messaggi privati
Bradipao @ Play Store

Offline davix10

  • Utente normale
  • ***
  • Post: 159
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Lg G4
  • Play Store ID:
    davix10
  • Sistema operativo:
    Windows 10
Re:Ricezione bluetooth
« Risposta #7 il: 04 Marzo 2015, 14:22:25 CET »
0
No, non lo faccio. Come dovrei fare per il controllo?

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:Ricezione bluetooth
« Risposta #8 il: 04 Marzo 2015, 15:08:29 CET »
+1
Quando fai "read" il valore che ti ritorna (e che memorizzi in bytes) è proprio il numero di caratteri letti.

Tu dai per scontato che siano 8 (perchè leggi le locazioni con offset da 0 a 7), ma non è assolutamente detto.
Dovresti fare un controllo.
NON rispondo a domande nei messaggi privati
Bradipao @ Play Store

Offline davix10

  • Utente normale
  • ***
  • Post: 159
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Lg G4
  • Play Store ID:
    davix10
  • Sistema operativo:
    Windows 10
Re:Ricezione bluetooth
« Risposta #9 il: 04 Marzo 2015, 15:22:20 CET »
0
Ma il controllo deve essere fatto qui
Codice (Java): [Seleziona]
bytes = mmInStream.read(buffer);
o qui?

Codice (Java): [Seleziona]
byte[] readBuf = (byte[]) msg.obj;
e se non ricevessi veramente 8 byte quale sarebbe il problema?

Post unito: 05 Marzo 2015, 09:23:12 CET
Ho risolto con il controllo! Grazie mille! :)
« Ultima modifica: 05 Marzo 2015, 09:23:13 CET da davix10, Reason: Merged DoublePost »