RFCOMM zerstückelt Nachrichten

  • 4 Antworten
  • Letztes Antwortdatum
H

hörnerwhisky

Neues Mitglied
9
Hallo Zusammen,

ich habe mein Testprogramm jetzt am laufen. Eingehende Nachrichten werden aber teilweise zerstückelt, dh. einzelne Zeichen oder Teilzeichenketten werden in mehreren einzelnen Textboxen angezeigt. Kann man das irgendwie beeinflussen, wann ein Eingangsstream als vollständig betrachtet und dann angezeigt wird? Ich denke dieser Codeschnipsel ist verantwortlich:
Code:
while (true) {
                try {
                    // Read from the InputStream
                    bytes = mmInStream.read(buffer);

                    // Send the obtained bytes to the UI Activity
                    mHandler.obtainMessage(BluetoothChat.MESSAGE_READ, bytes, -1, buffer)
                            .sendToTarget();
                } catch (IOException e) {
                    Log.e(TAG, "disconnected", e);
                    connectionLost();
                    break;
                }

Gruß
Hochsitzcola
 
Zuletzt bearbeitet:
Setze doch das senden hinter die while schleife!?

Gesendet von meinem GT-S5660 mit der Android-Hilfe.de App
 
blackfire185 schrieb:
Setze doch das senden hinter die while schleife!?

Das ist die Hauptschleife des Threads, die wird nur beendet wenn ein Fehler auftritt.
Ich werde mal versuchen die Schleife mit sleep auszubremsen, damit die Wahrscheinlichkeit höher wird, das das Senden vom gekoppelten Gerät abgeschlossen ist, bevor der sentToTarget-Befehl kommt. Wenn das nicht hilft, dann den String vor dem Senden untersuchen, ob ein CF-LF drin vorkommt.
Hat noch jemand eine andere Idee?

Gruß
Hörnerwhisky
 
Hallo Zusammen,

ich habe das jetzt auf Basis des Beispiels BluetoothChat so gelöst:
Die empfangene Nachricht wird byte für byte gespeichert. Wenn ein Carriage Return (Ascii-Code 13) erkannt wird, werden die einzelnen Bytes zum String zusammen gesetzt und als String gesendet. Setzt natürlich voraus, das der Sender immer ein CR am Schluß der Nachricht sendet. Vielleicht hilft es ja jemanden.

In BluetoothChatService.java:

Code:
 public void run() {
            Log.i(TAG, "BEGIN mConnectedThread");
            int[] buffer = new int[1024];
            byte flag =0;
            String Zeile = "";
            int size;
                        int m=0;
            // Keep listening to the InputStream while connected
            while (true) {
            	
            	try {
                    
            		size=mmInStream.available();
            		if((size)>0){
	            		Log.d(TAG, "Reading bytes from scribbler: "+size);
	            		while (flag==0){
	            			buffer[m]=mmInStream.read();
	            			if(buffer[m]==13){
	            				Zeile = new String(buffer, 0, m);
	            				flag=1;
	            				}
	            			m++;
	            			}
	            		
	            		if(flag!=0){
	            		
	            			mHandler.obtainMessage(BluetoothChat.MESSAGE_READ, m, -1, Zeile)
                            .sendToTarget();
            				m=0;
            				flag=0;
	            		}
            		}
            	                	
                } catch (IOException e) {
                    Log.e(TAG, "disconnected", e);
                    connectionLost();
                    break;
                }
            }
        }

in BluetoothChat.java mus die Nachricht als String empfangen werden:

Code:
case MESSAGE_READ:
            	String readMessage = (String) msg.obj;
            	
                mConversationArrayAdapter.add(mConnectedDeviceName+":  " + readMessage);
                 
                break;
 
hier nun das Ergebnis, Geocachingfans werden vielleicht ihre Freude dran haben.



Gruß
Hörnerwhisky
 

Anhänge

  • Hörnerapp.apk
    35,8 KB · Aufrufe: 908
Zurück
Oben Unten