Android Tutorial Android Serial Tutorial

klaus

Expert
Licensed User
Longtime User
Dieses Tutorial befaßt sich mit der Serial-Library. Diese Library, erlaubt mit anderen Bluetooth-Geräten mit Hilfe von virtuellen seriellen Schnittstellen (RFCOMM) in Verbindung zu treten.

Das Programm zu diesem Tutorial befindet sich am Ende.
Das Englische Originaltutorial.

Beachten Sie, daß dieses Beispiel die Core Library v1.05 oder höher benötigt.
Die Serial Library benötigt Android OS 2.0 oder höher (API-Level 5 oder höher).

Wir bauen ein einfaches Chat-Beispiel mit zwei angeschloßenen Geräten die Text Meldungen senden.


serial_chat2.png


Wir haben ein Process globales Objekt erstellet mit dem Namen Serial1 und vom Type Serial.
Normalerweise ist es eine gute Idee, Prozess-Objekte in Sub Activity_Create zu initialisieren wenn die FirstTime Variable True ist. Auf diese Weise werden diese Objekte nur einmal initialisiert.

B4X:
Sub Activity_Create(FirstTime As Boolean)
    If FirstTime Then
        Serial1.Initialize("Serial1")
        Timer1.Initialize("Timer1", 200)
    End If
    Activity.LoadLayout("1")
    Activity.AddMenuItem("Connect", "mnuConnect")
    Activity.AddMenuItem("Disconnect", "mnuDisconnect")
End Sub
Die nächste Subroutine die durchlaufen wird ist Activity_Resume:

B4X:
Sub Activity_Resume
    If Serial1.IsEnabled = False Then
        Msgbox("Please enable Bluetooth.", "")
    Else
        Serial1.Listen 'listen for incoming connections
    End If
End Sub
Hier überprüfen wir ob Bluetooth im Gerät aktiviert ist. Wenn es nicht aktiviert ist fragen wir den Benutzer das Gerät zu aktivieren. Beachten Sie daß wir diesen Code in die Activity_Resume Routine eingefügt haben und nicht in die Activity_Create Routine somit wird der Test jedesmal durchgeführt wenn die Activity aktiviert (resumed) wird. Wenn der Benutzer in den Settings Screen geht und das Bluetooth aktiviert und dann wieder in die Anwendung zurück kehrt, wissen wir daß Bluetooth aktiviert ist.

Sobald Bluetooth aktiviert ist, warten wir auf eingehende Verbindungen. Das erlaubt andere Geräte mit unserem Gerät in Verbindung zu treten. Dies ist nicht erforderlich, wenn wir mit einem Gerät in Verbindungen treten wollen das auf Verbindungen wartet (wie das externe GPS zum Beispiel).

Beachten Sie, daß ein mehrmaliger Aufruf von Listen nichts aus macht. Und wir sind auf der sicheren Seite wenn wir es so machen.

Wenn der Benutzer auf den Connect Menüeintrag drückt zeigen wir die Liste der bekannten gepaarten Geräte an. Wenn der Benutzer jetzt auf einen Gerätenamen klickt holen wir seine MAC Adresse von der Map und verbinden es mit unserem Gerät:


serial_chat_1.png


B4X:
Sub mnuConnect_Click
    Dim PairedDevices As Map
    PairedDevices = Serial1.GetPairedDevices
    Dim l As List
    l.Initialize
    For i = 0 To PairedDevices.Size - 1
        l.Add(PairedDevices.GetKeyAt(i)) 'add the friendly name to the list
    Next
    Dim res As Int
    res = InputList(l, "Choose device", -1) 'show list with paired devices
    If res <> DialogResponse.CANCEL Then
        Serial1.Connect(PairedDevices.Get(l.Get(res))) 'convert the name to mac address
    End If
End Sub

Die Verbindung wird nicht sofort erstellt, das wird im Hintergrund vorgenommen. Wenn die Verbindung hergestellt ist wird das Connected Event ausgelöst. Der 'Success' Parameter informiert uns ob die Verbindung erfolgreich erstellt wurde.

Das Connected Event kann auch ausgelöst werden wenn eine einkommende Verbindung erstellt wurde.
B4X:
Sub Serial1_Connected (Success As Boolean)
    If Success Then
        ToastMessageShow("Connected successfully", False)
        TextReader1.Initialize(Serial1.InputStream)
        TextWriter1.Initialize(Serial1.OutputStream)
        timer1.Enabled = True
        connected = True
    Else
        connected = False
        Timer1.Enabled = False
        Msgbox(LastException.Message, "Error connecting.")
    End If
End Sub
Wenn die Verbindung erfolgreich erstellt wurde können wir mit dem Datentransfer anfangen.
TextReader1 und TextWriter1 sind Process Global Objekte. Jetzt initialisieren wir diese als Serial1.InputStream und Serial1.OutputStream. Des erlaubt uns mit der neu erstellten Verbindung Texte zu senden und zu empfangen.
Timer1 wird benutzt um zu testen ob eingegangene Daten bereit sind und wenn ja diese Daten zu lesen. Jetzt aktivieren wir den Timer und warten auf Daten.

Falls die Verbindung fehl gegangen ist rufen wir die Exception ab und zeigen sie an.

Meldungen senden – Wenn der Benutzer den btnSend Button drückt senden wir den Text:

B4X:
Sub btnSend_Click
    If connected Then
        TextWriter1.WriteLine(txtSend.Text)
        TextWriter1.Flush
        txtSend.Text = ""
    End If
End Sub
'connected' ist eine Variable die wir benutzen um zu wissen ob wir derzeit verbunden sind.
Beachten Sie, daß wir Flush nach dem Senden des Textes aufrufen. Auf diese Weise stellen wir sicher, daß TextWriter den Text nicht puffert und ihn sofort schickt.

Meldungen empfangen – Jedesmal wenn die Timer1_Tick Routine aufgerufen wird überprüfen wir ob Daten zum einlesen bereit stehen. Wenn ja, lesen wir sie und hängen sie in der großen EditText View an:


B4X:
Sub Timer1_Tick
    If connected Then
        If TextReader1.Ready Then 'check if there is any data waiting to be read
            txtLog.Text = txtLog.Text & TextReader1.ReadLine & CRLF
            txtLog.SelectionStart = txtLog.Text.Length
        End If
    End If
End Sub
TextReader.ReadLine ist ein blockierender Aufruf. Er wartet, bis mindestens ein einzelnes Zeichen zum lesen bereit ist. Deshalb müßen wir TextReader.Ready testen wenn wir nicht unsere Anwendung blockieren wollen.
Diese Anwendung kann auch zur Verbindung mit nicht Android Geräten benutzt werden.

Ein externes GPS zum Beispiel:
serial_3.png


Das externe GPS sendet kontinuierlich Daten als Text.
Ich hatte gerade eine sehr interessante Unterhaltung mit dem externen GPS...

Das Programm zu diesem Tutorial :

zip.gif
SerialExample.zip
 
Last edited:

Similar Threads

Top