Autore Topic: Rallentamento della trasmissione bluetooth  (Letto 645 volte)

Offline davix10

  • Utente normale
  • ***
  • Post: 159
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Lg G4
  • Play Store ID:
    davix10
  • Sistema operativo:
    Windows 10
Rallentamento della trasmissione bluetooth
« il: 22 Dicembre 2015, 18:19:01 CET »
0
Salve a tutti, ho un problema riguardante la ricezione di pacchetti tramite bluetooth. Ricevo pacchetti da 260 bytes ogni 32 ms e dopo, averli interpretat,i li plotto. Dato che la ricezione è in un thread separato e che quindi non posso cambiare la UI dal thread ho utilizzato questo metodo:

Codice (Java): [Seleziona]
finito=false;
                    runOnUiThread(new Runnable() {
                        @Override
                        public void run() {
                            mSeries1.resetData(GenerateData(listaCH1.size()));
                            finito = true;
                        }
                    });

                    while (finito == false) {

                    }
                    finito = false;

Il problema sorge in alcuni dispositivi che vanno in out of memory e dopo un po' l'app crasha anche se non per questa parte di codice che ho inserito perchè ho provato a commentarla e il problema si ripresenta, anche se regge per un tempo maggiore. (quindi anche senza plot ho il problema)

Questa è la parte di codice legata alla lettura

Codice (Java): [Seleziona]
while (bt.isConnected() && ascolto == true) {

                try {

                    int byteDaLeggere = 260;
                    byteLetti = 0;
                    int n = 0;
                    while (byteDaLeggere > 0) {
                        try {

                            n = bt.getInputStream().read(buffer, byteLetti, byteDaLeggere);
                            Thread.sleep(0);
                        } catch (Exception e) {

                        }
                        byteLetti += n;
                        byteDaLeggere -= n;

                    }
                    listaCH1.clear();
                    String str = null;


                    for (int ii = 4; ii < 259; ii += 2) {

                        if (ii % 4 == 0) {
                            Ch1 = (short) (buffer[ii + 1] | (buffer[ii] & 0xFF) << 8);
                            listaCH1.add(Ch1);
                        } else
                            Ch2 = (short) (buffer[ii + 1] | (buffer[ii] & 0xFF) << 8);

                    }

                    finito=false;
                    runOnUiThread(new Runnable() {
                        @Override
                        public void run() {
                            mSeries1.resetData(GenerateData(listaCH1.size()));
                            finito = true;
                        }
                    });

                    while (finito == false) {

                    }
                    finito = false;



                    Thread.sleep(2);
                } catch (InterruptedException e) {
//                    e.printStackTrace();
                }


            }

Quale potrebbe essere il problema secondo voi e poi perchè accade solo su alcuni dispositivi?

Grazie :)

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:Rallentamento della trasmissione bluetooth
« Risposta #1 il: 23 Dicembre 2015, 08:01:48 CET »
+1
Questo è quello che accade, secondo me:

Anche se su dispositivi particolarmente potenti (per cpu e memoria) non ti accade, il problema principale è che nei loopdi ricezione, che si ripetono frequentemente (ogni 32ms), NON dovresti creare nessun oggetto java. Per esempio nel tuo codice noto che nel loop di ricezione maneggi una lista, facendo prima clear e poi aggiungendo un byte alla volta. Ecco, a seconda di come è fatta questa lista, questa parte di codice può essere devastante. Potrebbe creare un oggetto java per ogni byte che aggiungi e poi quando fai clear della lista li rende tutti non validi, ma non ancora recuperati dal garbage collector.

Il metodo ottimale sarebbe allocare una volta per tutte (all'inizio) un buffer dati e poi nel thread di ricezione andare a scriverci i dati nuovi. Separatamente, nel thread di UI ti occupi di disegnare i dati contenuti nel buffer.
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:Rallentamento della trasmissione bluetooth
« Risposta #2 il: 23 Dicembre 2015, 14:58:45 CET »
0
Questo è quello che accade, secondo me:

Anche se su dispositivi particolarmente potenti (per cpu e memoria) non ti accade, il problema principale è che nei loopdi ricezione, che si ripetono frequentemente (ogni 32ms), NON dovresti creare nessun oggetto java. Per esempio nel tuo codice noto che nel loop di ricezione maneggi una lista, facendo prima clear e poi aggiungendo un byte alla volta. Ecco, a seconda di come è fatta questa lista, questa parte di codice può essere devastante. Potrebbe creare un oggetto java per ogni byte che aggiungi e poi quando fai clear della lista li rende tutti non validi, ma non ancora recuperati dal garbage collector.

Il metodo ottimale sarebbe allocare una volta per tutte (all'inizio) un buffer dati e poi nel thread di ricezione andare a scriverci i dati nuovi. Separatamente, nel thread di UI ti occupi di disegnare i dati contenuti nel buffer.


Grazie per l'aiuto! In questo modo va decisamente meglio anche se a volte sembra invertire i due canali. Secondo te da cosa potrebbe essere dovuto? Ho cambiato il metodo di scrittura del grafico: ora ricevo i dati di un secondo e poi plotto sul grafico. Non faccio più un refresh ogni 32 ms perchè pensavo fosse troppo dispendioso.

Offline davix10

  • Utente normale
  • ***
  • Post: 159
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Lg G4
  • Play Store ID:
    davix10
  • Sistema operativo:
    Windows 10
Re:Rallentamento della trasmissione bluetooth
« Risposta #3 il: 28 Dicembre 2015, 15:24:24 CET »
0
Purtroppo non riesco a risolvere il problema legato alla conversione dei byte o a qualche altro problema che non riesco a capire. Potrebbe essere dovuto ad un rallentamento della ricezione del bluetooth. Ho cambiato metodo di conversione dei byte in short con segno utilizzando questa funzione:

Codice (Java): [Seleziona]
for (int ii = 4+(260*aa); ii < 260*(aa+1); ii += 2) {
                            if (ii % 4 == 0) {
//                                Ch1 = (short) (buffer[ii + 1] | (buffer[ii] & 0xFF) << 8);
                                bb.clear();
                                bb.order(ByteOrder.BIG_ENDIAN);
                                bb.put(buffer[ii]);
                                bb.put(buffer[ii+1]);
                                Ch1 = bb.getShort(0);
//                                Ch1 = (short) (((buffer[ii+1] & 0xFF) << 8) | (buffer[ii] & 0xFF));
                                listaCH1[contaCh1] = Ch1;
                                contaCh1++;
                            } else {
//                                Ch2 = (short) (buffer[ii + 1] | (buffer[ii] & 0xFF) << 8);
                                bb.clear();
                                bb.order(ByteOrder.BIG_ENDIAN);
                                bb.put(buffer[ii]);
                                bb.put(buffer[ii+1]);
                                Ch2 = bb.getShort(0);
//                                Ch2 = (short) (((buffer[ii+1] & 0xFF) << 8) | (buffer[ii] & 0xFF));
                                listaCH2[contaCh2] = Ch2;
                                contaCh2++;
                            }


Anche in questo caso visualizzo sul mio grafico degli "spike" dovuti sicuramente dalla conversione dato che nel buffer sembrano essere tutti corretti. Questo è un esempio di una parte di dati che visualizzo sul grafico:

Codice: [Seleziona]
72
74
76
78
71
82
77
73
76
82
82
82
82
86
82
-112
86
91
89
91
79
89
91
91

dovrebbero essere dei valori più o meno costanti che tendono a salire ma in mezzo è presente un -112


Non capisco veramente dove sbattere la testa...qualcuno di voi ha un'idea?


Grazie mille! :)