Italian Leggere dati da un servizio

Angelo Messina

Active Member
Licensed User
Longtime User
Ho preparato un servizio che gira e preleva dati da una device Bluetooth. ma ho un problema a recepire i dati corretti
Questo e il sorgente :

B4X:
Sub Process_Globals
    Dim BT As BluetoothAdmin
    Dim Serial1 As Serial
    Dim timBT As Timer
    Dim AStreams As AsyncStreams
    Dim tr As TextReader
    Dim DatiLetti As String
    Dim MyDeviceName As String
    Dim MacAddress As String
    Dim ValoreGSR As String
End Sub

Sub Service_Create
  
    If File.Exists(File.DirRootExternal, "Bluetooth.txt") Then
        tr.Initialize2(File.OpenInput(File.DirRootExternal, "Bluetooth.txt"), "Windows-1252")
        MacAddress = tr.ReadLine
        MyDeviceName = tr.ReadLine
        tr.Close
    End If

    ToastMessageShow("Connessione " & MyDeviceName & "  MacAddress "& MacAddress, True)
    ToastMessageShow("Trying to connect to " & MyDeviceName, True)
    timBT.Initialize("timBT",5000)
    timBT.Enabled = False
  
    Try
        BT.Initialize("BT")
        Serial1.Initialize("Serial1")
    Catch
        ToastMessageShow("No BlueTooth Device visible...", True)
    End Try
End Sub

Sub Service_Start (StartingIntent As Intent)
    'Start Bluetooth
    Try
        If BT.IsEnabled = False Then
            BT.Enable
        Else
            BTConnectToDevice
        End If
    Catch
        ToastMessageShow("No BlueTooth Device Connect ...", True)
    End Try

End Sub

Sub BT_StateChanged(NewState As Int,OldState As Int)
    If NewState = BT.STATE_ON Then
        BTConnectToDevice
        Log("BT Connect")
    Else
        Serial1.Disconnect
        timBT.Enabled = False
        Log("BT Disconnect")
    End If
End Sub

Sub BTConnectToDevice
    Try
        Serial1.Connect(MacAddress)
    Catch
        ToastMessageShow("Device not available",True)
    End Try
End Sub

Sub Serial1_Connected (Success As Boolean)

    If Success = True Then
        ToastMessageShow("Bluetooth connected to " & Serial1.Address, False)
        AStreams.Initialize(Serial1.InputStream,Serial1.OutputStream,"AStream")
        timBT.Enabled = True
    Else
        ToastMessageShow("Connection to " & Serial1.Address & " broken!", True)
        timBT.Enabled = False
    End If

End Sub

Sub AStream_NewData (Buffer() As Byte)

    DatiLetti = (BytesToString( Buffer, 0, Buffer.Length, "UTF8") )
    PrendiValori(DatiLetti)
    Log("Valore 1 Orginale: " & DatiLetti)
End Sub

Sub PrendiValori( Contenuto As String )
    ValoreGSR = Contenuto.Trim
    Log("Valore 2: " & ValoreGSR)
End Sub

Sub GetValue(Richiesta As Boolean)
    If Richiesta  Then
        CallSubDelayed2(Training, "GetResult", ValoreGSR)
    End If
End Sub

Sub timBT_Tick
    'Communicte with the device here
    'if the device answers, fine
    'if there is no response, communication might be lost
    'Stop the timer and you should call BTConnectToDevice again
End Sub


Sub Service_Destroy

End Sub


Mentre l'Activity che deve ricevere i dati :

B4X:
Sub GetResult(PresoQuesto As String)
    GSR = PresoQuesto
End Sub

Sub LeggiDatiDaGSR As Float
    Dim Valore As Float
  
    CallSubDelayed2(ModuloGSR, "GetValue",True)

    ToastMessageShow(GSR,False)
    Valore = GSR

    Return Valore
End Sub

GSR è dimensionata
su

Sub Globals

Dim GSR as String

End Sub


Va in errore
appena tolgo Valore = GSR
sostituendo con Valore = 1.2 niente errore ma chiaramente niente dati

I ToastMessageShow Mi fa vedere i dati prelevati da blutooth
 

MarcoRome

Expert
Licensed User
Longtime User
Quindi stai dicendo che il:
B4X:
 ToastMessageShow(GSR,False)
Torna il valore giusto.

Quando apri i Thread è FONDAMENTALE riportare il tipo di errore che hai nella finestra log ( a destra ).
Spiegandomi meglio potrebbe essere che il valore che ti restituisce GSR è tipo 1,2 che è diverso da 1.2 e quindi da stringa a Float ti restituisce un errore tipo:
** Service (starter) Create **
** Service (starter) Start **
** Activity (main) Create, isFirst = true **
main_activity_create (B4A line: 35)
Valore = GSR
java.lang.NumberFormatException: For input string: "1,2"
at java.lang.FloatingDecimal.readJavaFormatString(FloatingDecimal.java:1306)
at java.lang.Double.parseDouble(Double.java:547)
at b4a.example.main._activity_create(main.java:376)
at java.lang.reflect.Method.invoke(Native Method)
at anywheresoftware.b4a.BA.raiseEvent2(BA.java:179)
at b4a.example.main.afterFirstLayout(main.java:102)
at b4a.example.main.access$000(main.java:17)
at b4a.example.main$WaitForLayout.run(main.java:80)
at android.os.Handler.handleCallback(Handler.java:751)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:154)
at android.app.ActivityThread.main(ActivityThread.java:6688)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1468)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1358)


etc...
Riporta l'errore che hai
 

Angelo Messina

Active Member
Licensed User
Longtime User
si

ToastMessageShow(GSR,False)

riporta un elenco di tutte le letture
i valori sono 1.20099

perché il servizio fa letture dalla device continuamente in quanto la stessa manda dati continuamente

i log non ci sono perché non uso l'emulazione in quanto molto lenta
 

MarcoRome

Expert
Licensed User
Longtime User
Cos'è l'emulazione ??
Angelo, ti do un consiglio.
Utilizza un dispositivo
Quando hai un errore la prima cosa è capire il tipo di errore che ti restituisce. ( io me ne fregherei se è veloce o lenta...non devi mica distribuirla )
Ora hai due modi per farlo:
1. Connetti il dispositivo in Wif o con cavetto USB, compili in DEBUG e vedi il risultato dell'errore nella finestra dei log
2. Effettui il test con app compilata come se dovessi distribuire la stessa. Quando hai l'errore connetti la stessa con cavetto USB, apri B4A e clicchi sul pulsante Connect della finestra log, in rosso vedrai l'eventuale errore.

upload_2017-3-19_9-19-46.png


Se hai lo stesso, pubblica.
Buona giornata
 

Angelo Messina

Active Member
Licensed User
Longtime User
Ho Eliminato la

Sub Activity_WindowFocusChanged (Focused As Boolean)

End Sub
e questo errore non c'è più
 

MarcoRome

Expert
Licensed User
Longtime User
Angelo, quando ricevi una risposta OK si usano anche i like ..
upload_2017-3-19_14-32-20.png

cosi giusto per allinearti alla community
 

Angelo Messina

Active Member
Licensed User
Longtime User
scusa non ce più errore sul

Sub Activity_WindowFocusChanged (Focused As Boolean)

End Sub

in quanto remmato
 

Angelo Messina

Active Member
Licensed User
Longtime User
Valore 1 Orginale: 1,30853
Valore 1 Orginale: 1,0516
Valore 1 Orginale: 0,74456
Valore 1 Orginale: 1,32466
Valore 1 Orginale: 1,59898
** Activity (training) Create, isFirst = true **
** Activity (training) Resume **
GSR Traning :
Error occurred on line: 204 (Training)
java.lang.NumberFormatException: Invalid double: ""

B4X:
Sub LeggiDatiDaGSR As Float
      Dim Valore As Float
      Dim ValoreGSR As String


      CallSubDelayed2(ModuloGSR, "GetValue",True)
      ValoreGSR=GSR.Replace(",",".")
      Log("GSR Traning : " &     ValoreGSR)

204    Valore = ValoreGSR

    Return Valore
 

MarcoRome

Expert
Licensed User
Longtime User
Torna un valore invalido
Invalid double: ""
Quindi va in crash
Puoi utilizzare la funzione IsNumber
upload_2017-3-19_21-55-29.png


oppure:

B4X:
ValoreGSR=GSR.Replace(",",".")
Log("GSR Traning : " &     ValoreGSR)

if ValoreGSR.Lengh > 0 and IsNumber(ValoreGSR) then 
 Valore = ValoreGSR
End if
 
Top