Wie liest alle bytes, die zusammen über Bluetooth?
Ich habe eine Anwendung, die verwendet die bluetooth erhalten Sie einige Daten (bytes) von einem anderen Gerät. alles läuft gut, aber ich habe ein kleines Problem beim Empfang der bytes, die alle zusammen. Nach dem Empfang des bytes zeige ich Ihnen, auf einen Toast, nur um Sie zu testen. Wenn das andere Gerät sendet 10 Byte zusammen (zum Beispiel: "ABCDEFGHIJ"), das Programm das erste byte "A" und zeigen Sie es auf einem Toast, dann gehen Sie zu der zweiten iteration und Lesen, die anderen 9 bytes und zeigen "BCDEFGHIJ" auf dem Toast. Hier ist mein code:
byte[] buffer = new byte[1024]; //Read 1K character at a time.
int bytes = 0; //Number of bytes.
while(true)
{
try
{
//Read from the InputStream.
bytes = bInStream.read(buffer);
//Send the obtained bytes to the MainActivity.
mainActivityHandler.obtainMessage(MainActivity.MESSAGE_READ, bytes, -1, buffer).sendToTarget();
}
catch(IOException e)
{
connectionLost();
break;
}
}
In der MainActivity habe ich:
//The Handler that gets information back from the BluetoothManager.
private final Handler handler = new Handler()
{
@Override
public void handleMessage(Message msg)
{
switch(msg.what)
{
case MESSAGE_READ:
byte[] readBuf = (byte[]) msg.obj;
//construct a string from the valid bytes in the buffer.
String readMessage = new String(readBuf, 0, msg.arg1);
Toast.makeText(MainActivity.this, readMessage, Toast.LENGTH_SHORT).show();
break;
//...
}
}
};
Wie erhalte ich alle bytes zusammen?!
- Kann ich sehen, wie Sie sind, senden Ihre Nachrichten? Tun Sie etwas, das wie bOutStream.write("ABCDEFGHIJ".getBytes()) oder Sie schreiben Zeichen ein zu einer Zeit?
- Ein bluetooth-Modul angeschlossen ist, um arduino, so dass ich mit der serial monitor von der arduino-software zum senden der Nachricht.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Mmm höchstwahrscheinlich der Täter ist in der Art und Weise, Sie senden die Nachrichten. Erhält man keine Probleme hat, wird es empfangen, wie viele bytes (bis zu Ihrem 1024), wie es geschrieben wird.
Wenn Sie keine Kontrolle über die Art und Weise Nachrichten gesendet werden, Sie können vielleicht Lesen Sie ein byte auf einmal und senden Sie dann eine hf-Nachricht, die Sie, wenn Sie auf eine vordefinierte terminator. Ex: "ABCDEFGHIJ#", wobei # ist der terminator.
Wird die bluetooth-Verbindung stream basiert, nicht Paket-basiert. Es gibt keine Garantie oder versuchen, Sie zu bewahren packetization. Also eine beliebige Anzahl von Schreibzugriffen führen kann eine beliebige Anzahl von liest, nur den stream von bytes, die garantiert, um korrekt zu sein. Wenn Sie brauchen, um festzustellen, Pakete, Sie müssen Ihre eigenen Paket-Struktur, um wickeln Sie Ihre Daten. Fügen Sie beispielsweise ein Feld "Länge" vor jedem Daten-Paket, so dass Sie nachvollziehen können, auf der empfangenden Seite.
Akzeptiert die Antwort von @broody korrekt ist. Aber wenn die Daten selbst mit '#', könnte es schwierig werden, um die Daten abzurufen. So ist der beste Ansatz meiner Meinung nach ist das Anhängen von '\n', gefolgt von '\r' (oder andere Zeichen, die unwahrscheinlich sind, um die Funktion als Daten Siehe ASCII-Tabelle) in das Gerät sendet die Daten auf Ihr Android-app. Es fungiert einfach als Line feed und markiert das Ende der Daten.
ZB: ABCDEFGH\n\r
Dann kann der code so etwas wie dieses :
Hoffe es hilft
Hinsichtlich
#
Zeichen auf der Arduino-Seite. Habe ich einfach übersprungen, der check für die\r
(ich prüfen nur für\n
), und es funktioniert wie ein Charme.Lesen alle bytes zusammen, die Sie benötigen, zu trennen die Daten von "\n" oder "\r" oder "\r\n" im code..
Beispiel: Wenn Sie möchten, senden der Daten von Arduino zur Android-app über Bluetooth:
(Arduino code):
Und nun, zum Lesen der gesendeten Daten (Wert der variable 'zaehler'), hier ist der code von Android Studio:
Und so:(in der onCreate () - Methode):
Keine der oben genannten Antworten, die für mich gearbeitet . Thread.sleep(1000) gab mir die Lösung
Einer Weise zu behandeln, mehr-als-Puffer-Nachrichten (kann gefährlich sein, weil dauern kann, bis Sie Ihr Gedächtnis, wenn Sie nie gelöscht) behandeln in Blöcken: