2010-08-18 5 views
11

Ich habe ein Problem mit der Datenintegrität mit einer RFCOMM-Buchse über Bluetooth in Android. Ich habe keine Verbindungsprobleme, aber die Daten, die ich erhalte, sind verstümmelt und nicht die gleichen wie die Daten, die gesendet werden. Die Daten werden von einem RS232-Gerät über einen Bluetooth-Adapter gesendet, mit dem das Telefon verbunden ist. Es gibt kein Problem mit dem Adapter, da die Daten ordnungsgemäß empfangen werden, wenn ich mich mit einem Laptop verbinde.Data Transmisison Fehler mit SPP über Bluetooth auf Android

Meine Bluetooth-Verbindung wird basierend auf der BluetoothChat Beispielanwendung auf der Android-Entwickler-Website (http://developer.android.com/resources/samples/BluetoothChat/index.html) ohne Änderungen behandelt. Die gesendeten Daten sind einfacher Text und Steuerzeichen (die vor der Anzeige für den Benutzer entfernt werden). Das spezifische Problem, das ich habe, ist, dass ein Teil des Textes fehlt, ein Teil davon wird wiederholt, usw. Die lustige Sache ist, wenn ich an einen Computer mit einer Terminal-App anschließe und dort eintippe, werden die Daten fein übertragen. Wenn ich mich mit der App GetBlue mit dem Gerät verbinde, werden die Daten in Ordnung empfangen.

Ich denke, das Problem ist, was macht GetBlue möglicherweise anders, um seine Bluetooth-Datenübertragung zu handhaben, oder gibt es eine andere Möglichkeit, Bluetooth-Daten über eine RFCOMM-Buchse auf Android zu empfangen?

+0

Ich denke, ein Teil des Problems hat mit Threading zu tun, da die Funktion, die den Stream liest in einem separaten Thread ist. Außerdem werden die Daten schnell gesendet. – MortalToaster

Antwort

9

Die Lösung bestand darin, die Zeichenfolge im verbundenen Thread direkt nach dem Aufrufen von read() für den InputStream zu erstellen und dann die Zeichenfolge an den Hauptthread zur Anzeige zurückzuleiten. Aus irgendeinem Grund führte das Übergeben des Bytearrays zwischen den Threads zu einer signifikanten Wiederholung und zu Datenverlust.

Modified run() 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; 
      } 
     } 
    } 

Und der Handler Empfang:

 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

Das Problem mit dem Bluetooth-Chat-Beispiel in der ursprünglichen Implementierung besteht darin, dass Zeichen, die schneller als die menschliche Schreibgeschwindigkeit sind, verwendet werden, wenn Zeichen verloren gehen oder scheinbar wiederholt werden. Der Grund dafür ist extrem einfach: Das Byte [] -Array, dessen Referenz über den 'Handler' an die UI übergeben wird, wird bald mit neueren Zeichen aus der nachfolgenden' .read() '-Operation gefüllt. Daher müssen Sie wirklich eine Art Ringpuffer zwischen dem verbundenen 'Thread' und dem, was die empfangenen Daten verarbeitet, implementieren. – Trevor

+0

@Trevor & @@ MortalToaster, vielen Dank. Ich habe mich eine ganze Weile mit ihm herumgeschlagen. –

2

Dieser Fehler ist, da das Objekt Bezug auf die UI übergeben wird, wenn Sie die Byte-Array kopieren (Puffer) zu einem anderen Byte-Array funktioniert es.

Verwandte Themen