1. Nimm jetzt an unserem 2. ADVENT-Gewinnspiel teil - Alle Informationen findest Du hier!

Bluetooth empfang, RFCOMM

Dieses Thema im Forum "Android App Entwicklung" wurde erstellt von molleb, 28.01.2012.

  1. molleb, 28.01.2012 #1
    molleb

    molleb Threadstarter Neuer Benutzer

    Beiträge:
    20
    Erhaltene Danke:
    0
    Registriert seit:
    01.12.2011
    Hallo

    Ich brauch mal eine Hilfe.
    Ich habe mir eine Bluetoothverbindung aufgebaut vom Android nach BT222. Das senden geht wunderbar.
    Beim empfangen lass ich es über ein Thread laufen, im Handler schiebe ich den Empfangendenstring an einer Textbox, nach jeder Message wird eine neue Zeile angefangen.
    Nun habe ich das Problem, wenn ich zb "Hallo" empfange, steht nach jeder 2-3 Messege mal *Ha* neue zeile, *llo*. Es wird also schon ein Handler abgearbeitet, obwohl der string noch nicht komplett ist, wie kann ich zb nach x Zeichen den Handler starten lassen oder nach definierten Steuerzeichen?
    Wie sollte ich sonst damit weiterarbeiten können, wenn ich nie weiß ob die Message komplett ist und nicht aufgeteilt wurd?

    Senden vom BT222 aus tue ich momentan mit dem PC, das soll nachher der Mikrocontroller übernehmen.

    Hat einer auch eine Idee wie ich die Daten am besten Manage zum weiterverarbeiten?
    Beim Mikrocontroller lass ich mir die zu empfangen zeichen als 1.Byte angeben und das 2.Byte wär die Art der Message.

    Bin noch nicht ganz so Fit mit Java und ich finde nur wenig Infos über dieses Thema. *Datenverarbeitung über Serial*
     
  2. molleb, 05.02.2012 #2
    molleb

    molleb Threadstarter Neuer Benutzer

    Beiträge:
    20
    Erhaltene Danke:
    0
    Registriert seit:
    01.12.2011
    Hmm hat keiner eine Idee oder ein Vorschlag?
     
  3. frank_m, 05.02.2012 #3
    frank_m

    frank_m Ehrenmitglied

    Beiträge:
    20,742
    Erhaltene Danke:
    8,197
    Registriert seit:
    21.09.2010
    Phone:
    Samsung Galaxy S5 Duos (G900FD)
    Tablet:
    Samsung Galaxy Tab S 8.4
    Bluetooth arbeitet asynchron. Du kannst dich niemals darauf verlassen, dass ein String vollständig ankommt. Genau so kann es passieren, dass du den Beginn des nächsten Strings noch am Ende des vorhergehenden präsentiert bekommst. Also anstatt
    "Hallo
    Kurt"

    empfängst du

    "Hallo Ku
    rt"

    Eine serielle Bit-Pipe, wie es ein RFCOMM Kanal ist, eignet sich nicht, rein transparent paketvermittelte Daten auszutauschen. Du brauchst auf jeden Fall ein Protokoll drumherum, aus dem die Konstellation der Pakete ermitteln kannst. Entweder schickst du einen Header vorweg, der u.a. eine Längeninformation enthält, oder du sendest definierte Delimiter-Bytes, die du in der Payload escapest (wie z.B. SLIP es macht).
     
  4. strider, 05.02.2012 #4
    strider

    strider Erfahrener Benutzer

    Beiträge:
    208
    Erhaltene Danke:
    45
    Registriert seit:
    30.09.2011
    Phone:
    Nexus S
    Wenn ich deine Frage richtig verstanden habe, ist das der Punkt bei dem du Hilfe brauchst. Wobei ich nicht so ganz verstehe wo das genau Problem hier liegt. Auf den ersten Blick ist die Antwort auf dein Problem: Alles Zwischenspeichern was ankommt bis X Zeichen da sind und dann erst den Handler auslösen. Oder hab ich was übersehen?
     
  5. molleb, 06.02.2012 #5
    molleb

    molleb Threadstarter Neuer Benutzer

    Beiträge:
    20
    Erhaltene Danke:
    0
    Registriert seit:
    01.12.2011
    Hmm genau an diesen Punkt habe ich mein Problem, wie kann ich den Heater starten lassen, wenn er eine bestimmte Anzahl an Packeten empfangen hat?
    Kann mir einer ein Beispiel Protokol, ein sehr einfaches *zb Byte0=Anzahl der Data-Byte, Byten=Databyte* geben?
     
  6. frank_m, 06.02.2012 #6
    frank_m

    frank_m Ehrenmitglied

    Beiträge:
    20,742
    Erhaltene Danke:
    8,197
    Registriert seit:
    21.09.2010
    Phone:
    Samsung Galaxy S5 Duos (G900FD)
    Tablet:
    Samsung Galaxy Tab S 8.4
    Ja, so kannst du es machen. Ein Byte am Anfang mit einer Längeninformation, dann die eigentliche Payload. Dann weißt du, auf wie viele Bytes du warten musst. Und wenn die alle da sind, kommt wieder eine Längeninformation.
     
  7. molleb, 10.02.2012 #7
    molleb

    molleb Threadstarter Neuer Benutzer

    Beiträge:
    20
    Erhaltene Danke:
    0
    Registriert seit:
    01.12.2011
    Ich habe mir das mal angeschaut.
    Also ich Empfange ein paar Daten, das Programm geht in sein Thread, arbeitet es ab und meldet es dem Threader, wo ich es weiter verarbeiten kann.
    Nun.. wie kann ich das erreichen das er mir bei x Bytes den Thread auslöst?
    Ich hole mir ja bei jedem Thread die Daten neu und überschreibe die alten Daten ja.
    Werden die Variables beim Thread jedesmal neu erzeugt oder bleiben die erhalten, samt Inhalt?
     
  8. molleb, 10.02.2012 #8
    molleb

    molleb Threadstarter Neuer Benutzer

    Beiträge:
    20
    Erhaltene Danke:
    0
    Registriert seit:
    01.12.2011
    Hier mal meine *Empfangsroutine*, ich programmiere normalerweise in C und für Mikrocontroller, daher könnte der Kode etwas komisch wirken.
    Leider bekomme ich immer nur 0 raus, egal ob ich die Globale Uart_buffer nehm oder die Lokale buffer_tmp.
    Code:
               while (true) {
                    try {
                    
                        Datan++;
    
                        // Read from the InputStream
                        bytes = mmInStream.read(buffer); 
                        
                        
                        if(Uart_bytes <5)//noch nicht alles empfangen
                        {
                            for(int n=0; bytes<n; n++)
                            {
                                Uart_buffer[n+Uart_bytes] = buffer[n];
                                
                            }
                        
                            Uart_bytes +=bytes;
                        }
                        
                        if(!(Uart_bytes <5))
                        {
                            
                            mHandler.obtainMessage(MESSAGE_READ, Uart_bytes, -1, Uart_buffer).sendToTarget();    
                            Uart_bytes=0;
                        }
                                                         
                   } catch (IOException e) {
                           break;
                    }
                }
            }
    
    Edit:
    Ahh hab den Fehler, hatte bei der Forschleife die </> vertauscht, nun geht es.
     
    Zuletzt bearbeitet: 10.02.2012

Diese Seite empfehlen