2010-08-18 5 views
11

Ho riscontrato un problema con l'integrità dei dati utilizzando un socket RFCOMM tramite Bluetooth in Android. Non ho problemi di connessione, ma i dati che ricevo sono confusi e non sono uguali ai dati inviati. I dati vengono inviati da un dispositivo RS232 tramite un adattatore Bluetooth al quale si connette il telefono. Non c'è un problema con l'adattatore dato che i dati vengono ricevuti correttamente se mi collego con un laptop.Errore di trasmissione dati tramite SPP su Bluetooth su Android

La mia connessione Bluetooth viene gestita in base all'applicazione di esempio BluetoothChat trovata nel sito degli sviluppatori Android (http://developer.android.com/resources/samples/BluetoothChat/index.html), senza modifiche. I dati inviati sono caratteri di testo e di controllo (che vengono rimossi prima della visualizzazione all'utente). Il problema specifico che ho è che manca parte del testo, alcuni di essi sono ripetuti, ecc. La cosa divertente è che se mi collego a un computer con un'app terminale e digito lì, i dati vengono trasmessi bene. Inoltre, se mi collego al dispositivo tramite l'app , i dati vengono ricevuti correttamente.

Quindi immagino che il problema è che cosa può fare GetBlue in modo diverso per gestire il trasferimento dati Bluetooth, o c'è un altro modo per ricevere dati Bluetooth su un socket RFCOMM su Android?

+0

Penso che una parte del problema abbia a che fare con il threading, poiché la funzione che legge nello stream è su un thread separato. Inoltre, i dati vengono inviati rapidamente. – MortalToaster

risposta

9

La correzione per la soluzione era di creare la stringa nella thread connessa, direttamente dopo aver chiamato read() su InputStream e quindi aver passato la stringa al thread principale per la visualizzazione. Per qualsiasi motivo, passare l'array di byte tra i thread ha portato a ripetizioni significative e perdita di dati.

run Modified() Codice:

public void run() { 
     byte[] buffer = new byte[256]; // buffer store for the stream 
     int bytes; // bytes returned from read() 

     // Keep listening to the InputStream until an exception occurs 
     while (true) { 
      try { 
       // Read from the InputStream 
       bytes = mmInStream.read(buffer); 
       String readMessage = new String(buffer, 0, bytes); 
       // Send the obtained bytes to the UI Activity 
       mHandler.obtainMessage(MESSAGE_READ, bytes, -1, readMessage) 
         .sendToTarget(); 
      } catch (IOException e) { 
       break; 
      } 
     } 
    } 

E l'accoglienza del gestore:

 case MESSAGE_READ: 
      // Read in string from message, display to mainText for user 
      String readMessage = (String) msg.obj; 
      if (msg.arg1 > 0) { 
       mainText.append(readMessage); 
      } 
+7

Il problema con l'esempio della chat Bluetooth nella sua implementazione originale è che se viene utilizzato per ricevere caratteri a qualsiasi velocità più veloce della velocità di digitazione umana, inizierai a vedere i caratteri che vengono persi o apparentemente ripetuti. La ragione di ciò è estremamente semplice: l'array byte [] il cui riferimento è passato all'interfaccia utente tramite il 'Handler', viene presto riempito con nuovi caratteri dalla successiva operazione' .read() '. Quindi è davvero necessario implementare una sorta di buffer circolare tra il 'Thread' connesso e qualunque cosa stia elaborando i dati ricevuti. – Trevor

+0

@Trevor & @@ MortalToaster, grazie mille. Ho lottato con esso per un bel po '. –

2

Questo errore è perché è passato il riferimento all'oggetto per l'interfaccia utente, Se si copia l'array di byte (tampone) a un altro array di byte funziona.