2016-07-22 6 views
0

Ich habe eine App erstellt, die Daten von einem BT-Sender (Bluegiga) empfängt. Die Messwerte stammen von EEG-Signalen. Die Datenrate beträgt 1Khz (ich muss zugeben, dass es hoch ist). Jedenfalls erhalte ich einige Daten für einige Sekunden und dann verhält sich das Bluetooth so, als ob keine Daten eintreffen (was nicht stimmt). Wenn ich versuche, die Bluetooth-Verbindung mit der App zu trennen, ist klar, dass keine Kommunikation mehr mit dem BT-Modul an der EEG-Karte besteht, da es nicht auf die Verbindung reagiert (Es hat eine LED, die anzeigt, wenn es verbunden ist. t schalten von/auf oder irgendetwas).SPP Android BT Verbindung beendet nach Sekunden (EEG-Messwerte)

Wenn ich die Datenrate auf (sagen wir 500hz) verringern, funktioniert die App in Ordnung, mit einigen gelegentlichen 'quits', aber erträglich. Wenn ich es mehr reduziere, funktioniert die App ohne Probleme.

Fluch, per Design, meine App muss mit 1Khz Datenrate arbeiten, so hier ist, wo das Problem kommt.

Ich habe einige andere Post, versuchen, eine Art von Sns zu schlagen, aber nichts passt genau zu meinem Problem (jedenfalls habe ich versucht, die Informationen auf ihnen zu verwenden, aber mit keinem Erfolg offensichtlich).

Manchmal bekomme ich diese Nachricht, "dm_pm_timer abläuft", manchmal nein (nachdem die BT nicht mehr funktioniert).

Leider gibt es keinen Hinweis, Exception oder eine Nachricht, die mir sagen, was los ist.

Hier ist mein Code für die BT Empfang Thema

class BluetoothReadThread extends Thread { 


    private final InputStream iStream; 
    private final OutputStream mmOutputStream; 

    private boolean continueReading = true; 

    public BluetoothReadThread() { 
     InputStream tmp = null; 
     OutputStream tmp2 = null; 

     try { 
      tmp = btSocket.getInputStream(); 
      tmp2 = btSocket.getOutputStream(); 

     } catch (IOException e) { 
     } 
     iStream = tmp; 
     mmOutputStream = tmp2; 


    } 

    @Override 
    public void run() { 

     int c; 
     int waitCount = 0; 
     while (continueReading) { 
      try { 


       if (iStream.available() > 0) { 
        waitCount = 0; 
        c = iStream.read(); 
        readBuffer[readBufferPosition++] = c; 


        if (readBufferPosition == bitsExpected) { 


         if (bitsExpected == 22) { 
          ch1 = MultiplicationCombine(readBuffer[4], readBuffer[3]); 
          ch2 = MultiplicationCombine(readBuffer[6], readBuffer[5]); 
          ch3 = MultiplicationCombine(readBuffer[8], readBuffer[7]); 
          ch4 = MultiplicationCombine(readBuffer[10], readBuffer[9]); 
          ch5 = MultiplicationCombine(readBuffer[12], readBuffer[11]); 
          ch6 = MultiplicationCombine(readBuffer[14], readBuffer[13]); 
          ch7 = MultiplicationCombine(readBuffer[16], readBuffer[15]); 
          ch8 = MultiplicationCombine(readBuffer[18], readBuffer[17]); 


         } else { 




          ch1 = (int) filter_3((double)MultiplicationCombine(readBuffer[5], readBuffer[4], readBuffer[3])); 
          ch2 = (int) filter_4((double)MultiplicationCombine(readBuffer[8], readBuffer[7], readBuffer[6])); 
          ch3 = (int) filter_2((double)MultiplicationCombine(readBuffer[11], readBuffer[10], readBuffer[9])); 
          ch4 = (int) filter_2((double)MultiplicationCombine(readBuffer[14], readBuffer[13], readBuffer[12])); 
          ch5 = (int) filter_2((double)MultiplicationCombine(readBuffer[17], readBuffer[16], readBuffer[15])); 
          ch6 = (int) filter_2((double)MultiplicationCombine(readBuffer[20], readBuffer[19], readBuffer[18])); 
          ch7 = (int) filter_2((double)MultiplicationCombine(readBuffer[23], readBuffer[22], readBuffer[21])); 
          ch8 = (int) filter_2((double)MultiplicationCombine(readBuffer[26], readBuffer[25], readBuffer[24])); 


         } 

         Header_int = readBuffer[0]; 
         PK_ID_int = readBuffer[1]; 
         PK_Counter_int = readBuffer[2]; 


         if (downsample++ == downsample_value) { 
          addEntry(ch1/scaCh1, ch2/scaCh2, ch3/scaCh3, ch4/scaCh4, ch5/scaCh5, ch6/scaCh6, ch7/scaCh7, ch8/scaCh8); 
          downsample = 0; 
         } 
         //ProgrNum,PacketType,Ch1,Ch2,Ch3,Ch4,Ch5,Ch6,Ch7,Ch8,MRK 

         if (write_open) { 
          osw.write(PK_Counter_int + "," + PK_ID_int + "," + ch1 + "," + ch2 + "," + ch3 + "," + ch4 + "," + ch5 + "," + ch6 + "," + ch7 + "," + ch8 + "," + bolOpenClose + "\n"); 
          //osw.write(PK_Counter_int + "," + PK_ID_int + "," + ch1 + "," + ch2 + "," + ch3 + "," + ch4 + "," + ch5 + "," + ch6 + "," + ch7 + "," + ch8 + "," + "\n"); 
         } 

         System.out.println(PK_Counter_int + "," + PK_ID_int + "," + ch1 + "," + ch2 + "," + ch3 + "," + ch4 + "," + ch5 + "," + ch6 + "," + ch7 + "," + ch8 + ", AV=" + iStream.available()); 


         mmOutputStream.write(valueSTR.getBytes()); 

         // if(downsample++==14) { safe_copy(readBuffer); plot=true; downsample=0;} 


         readBufferPosition = 0; 
         try { 
          Thread.sleep(3); 
         } catch (InterruptedException e) { 
          e.printStackTrace(); 
         } 


        } 


       } 

      } catch (IOException e) { 
       System.out.println(e + "\nError sending data + :" + e); 
       // Bluetooth error! Stop reading. 
       //this.stopAndSendIntent(); 
      } 
     } 
    } 

    /* 
      public void stopAndSendIntent() { 

       this.cancel(); 

       Intent intent = new Intent(); 
       intent.setAction(BLUETOOTH_ACTION_DONE_READING); 
       sendBroadcast(intent); 
      } 
    */ 
    public void cancel() { 
     System.out.println("-----Cancelling readThread!!"); 
     try { 
      iStream.close(); 
     } catch (IOException e) { 
     } catch (NullPointerException e) { 
     } 
     ; 

     continueReading = false; 
    } 

} 

Es funktioniert wie folgt: Ich las eine empfangene Zeichen (c = iStream.read()). Dann kopiere ich dieses Zeichen in ein int-Array, bis ich die Länge des Pakets erreichen (es kann 22 oder 28 sein (BitsExpected)).

Der folgende Teil ist nur Filtern und Plotten des Signals.

Ich habe viele andere Implementierungen ausprobiert, aber ich bekomme das gleiche Ergebnis.

Auch wenn ich den Teil der Filterung und Plotting (nur Lesen von Daten) beseitigen, bleibt das Problem bestehen.

Wenn ich nicht mit Array arbeite, arbeite ich mit string, dh mit append() (was sollte das gleiche sein?) Ich bekomme eine funktionierende Verbindung (nicht quittiert), aber sobald ich das Programm manipuliere Mit dem Array ist alles gleich.

Ich bin schon mit diesem für 1 Monat stecken, so dass ich wirklich schätzen alle Kommentare, Erfahrungen aus der Vergangenheit oder Anregungen.

Vielen Dank im Voraus.

Antwort

0

Habe ich nur noch dieses Stück Code

if (PK_Counter_int % 100 == 0) mmOutputStream.write(startTring.getBytes()); 

und es funktioniert soweit ganz gut.

Verwandte Themen