Bluetooth empfang, RFCOMM

M

molleb

Neues Mitglied
0
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*
 
Hmm hat keiner eine Idee oder ein Vorschlag?
 
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).
 
molleb schrieb:
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?

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?
 
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?
 
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.
 
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?
 
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:

Ähnliche Themen

S
Antworten
4
Aufrufe
4.359
mblaster4711
mblaster4711
N
Antworten
8
Aufrufe
1.014
NerkJ
N
M
Antworten
11
Aufrufe
2.258
jogimuc
J
Zurück
Oben Unten