German String mit B4A und HC05 (Bluetooth versenden

funkheld

Member
Licensed User
Hallo, guten Tag.
Ich bekomme es nicht hin ein String zu versenden mit dem Programm B4a und einem HC05-Modul.
Einzelne Byte kann ich versenden und mein Minecraft damit zu steuern über ein Arduino.
Ich möchte gern ein String "wort" versenden.

Das ist mein Problem , mit einem String geht s nicht :
zum Beispiel
Dim text_vor As String
text_vor="vor"
CallSub2(Starter, "SendMessage", Array As Byte(0, text_vor))

Danke.
Gruss

B4X:
#Region  Project Attributes 
    #ApplicationLabel: Bluetooth Robot
    #VersionCode: 1
    #VersionName: 
    #SupportedOrientations: unspecified
    #CanInstallToExternalStorage: False
#End Region

#Region  Activity Attributes 
    #FullScreen: False
    #IncludeTitle: True
#End Region

Sub Process_Globals
   
End Sub

Sub Globals
    Dim btnvor As Button
    Dim btnzur As Button
    Dim btnlinks As Button
    Dim btnmitte As Button
    Dim btnrechts As Button
    Dim btnstop As Button
   
    Dim text_vor As Byte
    Dim text_zur As Byte
    Dim text_links As Byte
    Dim text_mitte As Byte
    Dim text_rechts As Byte
    Dim text_stop As Byte

    Private lblStatus As Label
    Private btnConnect As Button
    Private lblMessage As Label
    Private ProgressBar1 As ProgressBar
End Sub

Sub Activity_Create(FirstTime As Boolean)
    Activity.LoadLayout("1")
   
    text_vor=118
    text_zur=122   
    text_links=108
    text_mitte=109
    text_rechts=114
    text_stop=113
End Sub

Sub Activity_Resume
    SetState
End Sub

Public Sub SetState
    btnvor.Enabled = Starter.connected
    btnzur.Enabled = Starter.connected   
    btnlinks.Enabled = Starter.connected
    btnmitte.Enabled = Starter.connected
    btnrechts.Enabled = Starter.connected
    btnstop.Enabled = Starter.connected
   
    btnConnect.Enabled = Not(Starter.connected)
    ProgressBar1.Visible = Starter.connecting
   
    Dim status As String
    If Starter.connected Then
        status = "connected"
    else if Starter.connecting Then
        status = "trying to connect..."
    Else
        status = "disconnected"
    End If
    lblStatus.Text = $"Status: ${status}"$
End Sub

Public Sub MessageFromDevice(msg As String)
    lblMessage.Text = msg
End Sub

Sub Activity_Pause (UserClosed As Boolean)

End Sub

Sub btnvor_Click
    CallSub2(Starter, "SendMessage", Array As Byte(0, text_vor))
End Sub   
Sub btnzur_Click
    CallSub2(Starter, "SendMessage", Array As Byte(0, text_zur))
End Sub
Sub btnlinks_Click
    CallSub2(Starter, "SendMessage", Array As Byte(0, text_links))
End Sub
Sub btnmitte_Click
    CallSub2(Starter, "SendMessage", Array As Byte(0, text_mitte))
End Sub
Sub btnrechts_Click
    CallSub2(Starter, "SendMessage", Array As Byte(0, text_rechts))
End Sub
Sub btnstop_Click
    CallSub2(Starter, "SendMessage", Array As Byte(0, text_stop))
End Sub

Sub btnConnect_Click
    CallSub(Starter, "Connect")
End Sub

Sub lblStatus_Click
   
End Sub

Sub Delay(nMilliSecond As Long)
    Dim nBeginTime As Long
    Dim nEndTime As Long
    nEndTime = DateTime.Now + nMilliSecond
    nBeginTime = DateTime.Now
   
    Do While nBeginTime < nEndTime
        nBeginTime = DateTime.Now
        Log(nBeginTime)
        If nEndTime < nBeginTime Then
            Return
        End If
          DoEvents
    Loop
End Sub
 

GMan

Well-Known Member
Licensed User
Longtime User
Wie sieht denn STARTER aus ?
 

funkheld

Member
Licensed User
Danke.
Gruss

Das ist der Starter:
B4X:
#Region  Service Attributes 
    #StartAtBoot: False
    #ExcludeFromLibrary: True
#End Region

Sub Process_Globals
    Private serial As Serial
    Private admin As BluetoothAdmin
    Private ast As AsyncStreamsText
    Public connected As Boolean
    Public connecting As Boolean
End Sub

Sub Service_Create
    serial.Initialize("serial")
    admin.Initialize("admin")
End Sub

Public Sub Connect
    admin.StartDiscovery
    connecting = True
    CallSub(Main, "SetState")
End Sub

Private Sub admin_DeviceFound (Name As String, MacAddress As String)
    Log($"Device found: ${Name}"$)
    If Name = "HC-05" Then
        Log("Trying to connect...")
        admin.CancelDiscovery
        serial.Connect(MacAddress)
    End If
End Sub

Private Sub admin_DiscoveryFinished
    connecting = False
End Sub

Private Sub Serial_Connected (Success As Boolean)
    If Success Then
        If ast.IsInitialized Then ast.Close
        ast.Initialize(Me, "Ast", serial.InputStream, serial.OutputStream)
        Log("Connected")
        connected = True
       
    Else
        Log(LastException)
    End If
    connecting = False
    CallSub(Main, "SetState")
End Sub

Public Sub SendMessage(msg() As Byte)
    ast.astreams.Write(msg) 'sending bytes, not text
End Sub

Private Sub ast_NewText (Text As String)
    CallSub2(Main, "MessageFromDevice", Text)
End Sub

Private Sub ast_Terminated
    connected = False
    CallSub(Main, "SetState")
End Sub

Sub Service_Start (StartingIntent As Intent)

End Sub

'Return true to allow the OS default exceptions handler to handle the uncaught exception.
Sub Application_Error (Error As Exception, StackTrace As String) As Boolean
    Return True
End Sub

Sub Service_Destroy

End Sub
 

DonManfred

Expert
Licensed User
Longtime User
Bilde zuerst ein Bytearray mit allen benötigten Bytes und übergebe diese Array dann an den starter
https://www.b4x.com/android/forum/t...s-working-with-arrays-of-bytes.89008/#content

ungefähr so

B4X:
    Dim str As String = "vor"
    Dim bb As BytesBuilder
    bb.Initialize
    bb.Append(Array As Byte(0))
    bb.Append(str.GetBytes("UTF8"))
    CallSub2(Starter, "SendMessage", bb.ToArray)

PS: Im englischen Forum hast Du ZIG TAUSEND Personen mehr die potentiell Antworten geben können.
Im deutschen forum lesen/schreiben nicht viele. Ich auch nur selten.

Wirklich AKTIV sind aber auch im englischen Bereich nur wenige (insg vielleicht 100). Im deutschen vielleicht 5
 

GMan

Well-Known Member
Licensed User
Longtime User
So sieht mein Sendebefehl aus:
B4X:
AStream.Write(txtInput.Text.GetBytes("UTF8"))
Hier wird der zu sendende Text aus einem Textfield gelesen und übertragen
 

DonManfred

Expert
Licensed User
Longtime User
So sieht mein Sendebefehl aus
Grundsätzlich also ähnlich wie in meinem Beispiel.

Der Threadöffner hatte jedoch
CallSub2(Starter, "SendMessage", Array As Byte(0, text_vor))
angegeben. Ich nahm an, dass er erst ein 0 byte und dann den Text senden will, daher meine Antwort entsprechend.
 

GMan

Well-Known Member
Licensed User
Longtime User
Grundsätzlich also ähnlich wie in meinem Beispiel.

Der Threadöffner hatte jedoch

angegeben. Ich nahm an, dass er erst ein 0 byte und dann den Text senden will, daher meine Antwort entsprechend.
Und ICH wusste gar nicht, dass man auch auf andere Art und Weise über den (virt.) seriellen Port vom BT etwas senden/empfangen kann :)
Der Mensch lebt halt um zu lernen :rolleyes:
 

funkheld

Member
Licensed User
Hallo, Gman.
Mit 70 jahren spiele ich gern mit solchen Sachen.

Der Arduino Mega2560 wird durch ein BT-HC-05 angesteuert und der widerum vom Smartphone (B4A-Programm).
Wenn ich die Taste "an" drücke dann wird ein "a" gesendet vom B4A , auf den Mega2560 wird dann eine For-Schleife gestartet die 360 Daten sendet von 1-360 über das BT-HC-05 zum Smartphone. da zeichne ich jetzt Linien von 1-360 Grad.

Das gleiche funktioniert auch bei mir mit dem Arduino-Board WEMOS-D1 über einen Webserver mit einem Programm von B4A.

Mega2560-Code:
B4X:
byte inbyte;
byte i;

void setup()
{
    Serial1.begin(9600);
        Serial.begin(9600);
}

void loop()
{
   if (Serial1.available())
    {
        inbyte = Serial1.read();

        if(inbyte == 97)
        {
          for (int i=0; i<360; i++)
          {
            Serial1.println(i/2);
            delay(100);
          }
        }
    }
}
 

Attachments

  • Dscn4973.jpg
    Dscn4973.jpg
    77.3 KB · Views: 352
  • DSCN4974.JPG
    DSCN4974.JPG
    122.9 KB · Views: 357

GMan

Well-Known Member
Licensed User
Longtime User
Jepp, sowas verwende auch ich als SteuerungsApps für meine Modelleisenbahn und sonstige elektronische Spielereien :D
 
Top