2016-05-24 5 views
0

Ich arbeite mit Xamarin auf Visual Studio und den neuesten C# Bluetooth Chat, den ich online finden konnte. Ich habe Probleme, die richtige Ausgabe zu bekommen. Ich habe die Arduino Daten zu dem Bluetooth senden ~ alle 2 Sekunden wie folgtXamarin Bluetooth Chat mit Arduino - Geben seltsame zwei Zeilen Ergebnisse

Serial.Println("In Standby Mode"); 

Die Bluetooth-Chat-App aus dem UI dies mit einem Faden trennen empfängt

public override void Run() 
{ 
    Log.Info (TAG, "BEGIN mConnectedThread"); 
    //data from socket 
    byte[] buffer = new byte[1024]; 
    //number of bytes read 
     int bytes; 
     string bufferString; 

     // Keep listening to the InputStream while connected 
     while (true) { 
     try { 

       lock(buffer) 
        { 
         bytes = mmInStream.Read (buffer, 0, buffer.Length); 
         bufferString = System.Text.Encoding.ASCII.GetString(buffer); 
         var bufferStringJava = new Java.Lang.String(buffer, 0, buffer.Length); 


          System.Console.WriteLine("Incoming Data from Bluetooth Is:" + bufferStringJava); 

         _service._handler.ObtainMessage (BluetoothChat.MESSAGE_READ, bytes, -1, bufferString) //Edited to send a string instead of an array 
         .SendToTarget(); 

        } 

       } catch (Java.IO.IOException e) { 
        Log.Error (TAG, "disconnected", e); 
        _service.ConnectionLost(); 
        break; 
       } 
      } 

Sie können sehen, ich die Ausgabe gedruckt haben Hier. Auch habe ich die Ausgabe auf der Android-Aktivität gedruckt

Die Konsole Ausgabe ist sehr seltsam, Dinge wie folgt. In der Ausgabe fehlen normalerweise verschiedene Buchstaben.

05-24 22: 25: 29,286 I/Mono-stdout (4690): Eingehende Daten von Bluetooth ist: I Standby-Modus Eingehende Daten von Bluetooth ist: Ich Standby-Modus

05-24 22:25 : 29.306 I/mono-stdout (4690): Eingehende Daten von Bluetooth Ist: n Standby-Modus Eingehende Daten von Bluetooth Ist: n Standby-Modus

05-24 22: 25: 30.316 I/mono-stdout (4690) : Eingehende Daten von Bluetooth ist: I Standby-Modus Eingehende Daten von Bluetooth ist: I Standby-Modus

Die Activit Das Display ist auf dem Bild zu sehen. Im Wesentlichen wird alles korrekt angezeigt, aber der Text "Im Standby-Modus" teilt sich in der Regel in zwei Hälften.

Bluetooth Chat Output

Ich bin sehr verwirrt, warum es fehlende Buchstaben in meiner Konsole ausgegeben, aber nicht in der App angezeigt. Auch warum die App als zwei Zeilen angezeigt wird. Ich bin mir auch nicht sicher, warum meine Konsole zweimal dasselbe ausgibt.

Danke für die Hilfe!

Antwort

0

Ich habe herausgefunden, was passiert ist. Im Wesentlichen wiederholt sich der Thread, der die Bluetooth-Socket-Daten liest, ohne jede Verzögerung. Das Aussehen liest Daten aus dem Stream (mmInStream.Read()), dann senden Sie diese Daten mit einem Handler. Aber es liest einfach, was in diesem Moment verfügbar ist. Wenn also nur der Buchstabe "I" gesendet wurde, werden die anderen Buchstaben erst beim nächsten Mal um das Aussehen herum aufgenommen. Dies erklärt, warum die Nachricht aufgeteilt wurde. Ich habe das mit dem folgenden Code behoben.

if (mmInStream.IsDataAvailable()) 
    { 
    await System.Threading.Tasks.Task.Delay(20); 
    bytes = mmInStream.Read(buffer, 0, buffer.Length); 

Als nächstes, jedes Mal um das Aussehen, die Byte [] Pufferdaten wird nicht zurückgesetzt. Da ich jedesmal den gesamten Pufferspeicher nahm, blieben einige Zeichen aus früheren Lesevorgängen übrig, was mir seltsame Ausgaben gab.

Um dies zu beheben, kopierte ich den Puffer in eine Zeichenfolge der Länge jeweils auf die gelesenen Bytes, geben durch die Ganzzahlvariable namens Bytes.

for (int i = 0; i < bytes; i++) 
{ 
    temp[i] = buffer[i]; 
} 

bufferString = System.Text.Encoding.ASCII.GetString(temp); 

Ich habe immer noch nicht herausgefunden, wie man doppelte Ausgabe von Mono loswerden.

Verwandte Themen