Android Question AStream_NewData

Peter Augustin

Member
Licensed User
Longtime User
I still do not know how the AStream_NewData works. I am sending a string from MCU to Android and nothing happened.

B4X:
#Region Module Attributes
    #FullScreen: False
    #IncludeTitle: True
#End Region

'Activity module
Sub Process_Globals
    Dim AStream As AsyncStreams
    Dim Timer1 As Timer
End Sub

Sub Globals
  
    Dim s As String  
    Dim btnLed1 As Button
    Dim btnLed2 As Button
    Dim btnLed3 As Button
    Dim btnLed4 As Button
    Dim Label1 As Label
    Dim Label2 As Label
End Sub

Sub Activity_Create(FirstTime As Boolean)
    Activity.LoadLayout("2")
  
    If AStream.IsInitialized = False Then
        'AStream.InitializePrefix(Main.serial1.InputStream, True, Main.serial1.OutputStream, "AStreams")
        AStream.Initialize(Main.Serial1.InputStream, Main.Serial1.OutputStream, "AStreams")
    End If
    If FirstTime Then
    Timer1.Initialize("Timer1", 1000)
    Timer1.Enabled = True
    End If
  
End Sub

Sub AStreams_NewData (Buffer() As Byte)
  
    S = BytesToString(Buffer, 0, Buffer.Length, "UTF8")
  
    Label1.Enabled = True
    Label2.Enabled = True
  
    Label2.Text = s

End Sub

Sub AStream_Error
    ToastMessageShow("Connection is broken.", True)
  
End Sub

Sub AStream_Terminated
    AStream_Error
End Sub

Sub Activity_Resume
  
End Sub

Sub Activity_Pause (UserClosed As Boolean)
    If UserClosed Then
        AStream.Close
    End If
End Sub








Sub Timer1_tick

    Dim Temperature As String
    Temperature = "TEMP"
    AStream.Write(Temperature.GetBytes("UTF8"))

End Sub
Sub btnLed4_Click
    Timer1.Enabled = False
    Dim Led4_Toggle As String
    Led4_Toggle = "L4"
    AStream.Write(Led4_Toggle.GetBytes("UTF8"))
    Timer1.Enabled = True
End Sub
Sub btnLed3_Click
    Timer1.Enabled = False
    Dim Led3_Toggle As String
    Led3_Toggle = "L3"
    AStream.Write(Led3_Toggle.GetBytes("UTF8"))
    Timer1.Enabled = True
End Sub
Sub btnLed2_Click
    Timer1.Enabled = False
    Dim Led2_Toggle As String
    Led2_Toggle = "L2"
    AStream.Write(Led2_Toggle.GetBytes("UTF8"))
    Timer1.Enabled = True
End Sub
Sub btnLed1_Click
    Timer1.Enabled = False
    Dim Led1_Toggle As String
    Led1_Toggle = "L1"
    AStream.Write(Led1_Toggle.GetBytes("UTF8"))
    Timer1.Enabled = True
End Sub
 
Last edited:

Peter Augustin

Member
Licensed User
Longtime User
The problem solved. I used
B4X:
Label1.Enabled = True
Label2.Enabled = True

instead

B4X:
Label1.Visible = True
Label2.Visible = True
 
Upvote 0

Beja

Expert
Licensed User
Longtime User
Check Erel's BT chat example.. the new_data is working fine and it is a simple sub. I am using it for CRC only.
You may just copy/paste the sub to your project.

my two cents!
 
Upvote 0

Peter Augustin

Member
Licensed User
Longtime User
I have still a problem with receiving a string. The MCU ATMEGA sends every one second the string T23.5ES0110E. If i used Blueterm the same string was received but AStream_NewData receives different strings. Example:

E
ES
23.5ES0110E
T23.5ES0110E
5ES0110E
etc.

I do not understand why.

B4X:
#Region Module Attributes
    #FullScreen: False
    #IncludeTitle: True
#End Region

'Activity module
Sub Process_Globals
    Dim AStream As AsyncStreams
    'Dim Timer1 As Timer
End Sub

Sub Globals
   
   
    Dim btnLed1 As Button
    Dim btnLed2 As Button
    Dim btnLed3 As Button
    Dim btnLed4 As Button
    Dim Label1 As Label
    Dim Label2 As Label
    Dim Label3 As Label
End Sub

Sub Activity_Create(FirstTime As Boolean)
    Activity.LoadLayout("2")
    Label2.Visible = True
   
    If AStream.IsInitialized = False Then
        'AStream.InitializePrefix(Main.serial1.InputStream, True, Main.serial1.OutputStream, "AStreams")
        AStream.Initialize(Main.Serial1.InputStream, Main.Serial1.OutputStream, "AStreams")
    End If
    If FirstTime Then
    'Timer1.Initialize("Timer1", 1000)
    'Timer1.Enabled = False
    End If
   
End Sub

Sub AStreams_NewData (Buffer() As Byte)
   
    Dim S As String
    S = BytesToString(Buffer, 0, Buffer.Length , "UTF8")
   
    Label3.Text = S
   
    Label2.Text = S.SubString2(1,5)
   
       
    Label1.Text = S.SubString2(7,11)
   
   
    S = ""
   

End Sub

Sub AStream_Error
    ToastMessageShow("Connection is broken.", True)
   
End Sub

Sub AStream_Terminated
    AStream_Error
End Sub

Sub Activity_Resume
   
End Sub

Sub Activity_Pause (UserClosed As Boolean)
    If UserClosed Then
        AStream.Close
    End If
End Sub



'Sub Timer1_tick

'    Dim Temperature As String
'    Temperature = "TEMP"
'    AStream.Write(Temperature.GetBytes("UTF8"))
   
'End Sub
Sub btnLed4_Click
    'Timer1.Enabled = False
    Dim Led4_Toggle As String
    Led4_Toggle = "L4"
    AStream.Write(Led4_Toggle.GetBytes("UTF8"))
    'Timer1.Enabled = True
End Sub
Sub btnLed3_Click
    'Timer1.Enabled = False
    Dim Led3_Toggle As String
    Led3_Toggle = "L3"
    AStream.Write(Led3_Toggle.GetBytes("UTF8"))
    'Timer1.Enabled = True
End Sub
Sub btnLed2_Click
    'Timer1.Enabled = False
    Dim Led2_Toggle As String
    Led2_Toggle = "L2"
    AStream.Write(Led2_Toggle.GetBytes("UTF8"))
    'Timer1.Enabled = True
End Sub
Sub btnLed1_Click
    'Timer1.Enabled = False
    Dim Led1_Toggle As String
    Led1_Toggle = "L1"
    AStream.Write(Led1_Toggle.GetBytes("UTF8"))
    'Timer1.Enabled = True
End Sub
 
Upvote 0

Beja

Expert
Licensed User
Longtime User
Consider the propagation delay of the Android device.. either read the buffer at longer intervals using a timer, or change the MCU one second interval and continue polling the data.

My two cents
 
Upvote 0

KitCarlson

Active Member
Licensed User
Longtime User
Not all data arrives in a single NewData. It is necessary to concatenate parts, then when complete, do the label task. In your case "E", will not work as a terminator, since the string has another.

There is also an AsyncStreamsText class with tutorial by Erel on that. Stringbuilder is used to join data, and a terminator for the end.
 
Last edited:
Upvote 0

Beja

Expert
Licensed User
Longtime User
If CRC16 is calculated and used in both devices then will be ok.
 
Upvote 0
Top