2010-08-18 6 views
11

J'ai eu un problème avec l'intégrité des données en utilisant un socket RFCOMM sur Bluetooth dans Android. Je n'ai aucun problème de connexion, mais les données que je reçois sont brouillées et ne sont pas les mêmes que les données envoyées. Les données sont envoyées par un périphérique RS232 via un adaptateur Bluetooth auquel le téléphone se connecte. Il n'y a pas de problème avec l'adaptateur car les données sont correctement reçues si je me connecte avec un ordinateur portable.Erreur Data Transmisison utilisant SPP sur Bluetooth sur Android

Ma connexion Bluetooth est gérée à partir de l'exemple d'application BluetoothChat trouvé sur le site de développeur Android (http://developer.android.com/resources/samples/BluetoothChat/index.html), sans modification. Les données envoyées sont du texte brut et des caractères de contrôle (qui sont supprimés avant l'affichage à l'utilisateur). Le problème spécifique que j'ai est qu'une partie du texte est manquante, une partie est répétée, etc. La chose amusante est que si je me connecte à un ordinateur avec une application terminale et que j'y tape, les données sont transmises correctement. En outre, si je me connecte à l'appareil à l'aide de l'application GetBlue, les données sont reçues correctement.

Donc, je suppose que le problème est de savoir ce que GetBlue peut faire différemment pour gérer son transfert de données Bluetooth, ou y a-t-il un autre moyen de recevoir des données Bluetooth sur une socket RFCOMM sous Android?

+0

Je pense qu'une partie du problème concerne le thread, car la fonction qui lit le flux se trouve sur un thread distinct. En outre, les données sont envoyées rapidement. – MortalToaster

Répondre

9

Le correctif de la solution consistait à créer la chaîne dans le thread connecté, directement après l'appel de read() sur le InputStream, puis de renvoyer la chaîne au thread principal pour l'affichage. Pour une raison quelconque, le passage du tableau d'octets entre les threads a entraîné une répétition importante et une perte de données.

run Modifié() Code:

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; 
      } 
     } 
    } 

Et la réception du gestionnaire:

 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

Le problème avec l'exemple de conversation Bluetooth dans son implémentation d'origine est que s'il est utilisé pour recevoir des caractères à une vitesse supérieure à la vitesse de frappe humaine, vous commencerez à voir des caractères perdus ou apparemment répétés. La raison en est extrêmement simple: le tableau byte [] dont la référence est passée à l'interface utilisateur via le 'Handler' sera bientôt rempli avec des caractères plus récents de l'opération' .read() 'suivante. Par conséquent, vous devez vraiment implémenter une sorte de tampon circulaire entre le 'Thread' connecté et tout ce qui traite les données reçues. – Trevor

+0

@Trevor & @@ MortalToaster, merci beaucoup. J'ai eu du mal avec ça pendant un bon moment. –

2

Cette erreur est parce que la référence d'objet est passé à l'interface utilisateur, Si vous copiez le tableau d'octets (tampon) à un autre tableau d'octets cela fonctionne.

Questions connexes