Italian Stream

Angelo Messina

Active Member
Licensed User
Longtime User
Salve ho un problemino che non riesco a risolvere con B4A, la variabile strbyte contiene 10 byte con 8 di
Comando + 2 di CRC
Il server restituisce per ogni comando dei dati con una serie di dati di 8 byte
Il problema è che la write è in un giro for e quindi riesco a catturare sole l'ultima/e risposte che il server mi restituisce tramite la sub astream_newdata mentre ho necessità di avere una risposta per ogni comando. Quindi per ogni comando la risposta relativa dal server.
Grazie
 

Star-Dust

Expert
Licensed User
Longtime User
Non possiamo capire se non metti il pezzo di codice in B4A.

Praticamente invii i dato ma non riesci a leggere le risposte di OK perché il ciclo for non aspetta,,,

Hai provato il WaitFor dentro il ciclo per creare l'attesa della conferma di ogni invio ?
 

Angelo Messina

Active Member
Licensed User
Longtime User
Questo sub
esegue la trasmissione le stringhe CMD contengono i parametri da passare al server
funziona bene ho testato comando per comando
Sub QueryInverter()


ElencoValori.Put("SN" ,CMD_SN)
ElencoValori.Put("VR" ,CMD_VR)
ElencoValori.Put("ST" ,CMD_ST)
ElencoValori.Put("CET" ,CMD_CET)
ElencoValori.Put("CED" ,CMD_CED)
ElencoValori.Put("DSP3" ,CMD_DSP3)
ElencoValori.Put("DSP23",CMD_DSP23)
ElencoValori.Put("DSP25",CMD_DSP25)
ElencoValori.Put("DSP26",CMD_DSP26)
ElencoValori.Put("DSP27",CMD_DSP27)

For Giro=0 To ElencoValori.Size-1
Chiave=ElencoValori.GetKeyAt(Giro)
Valore=ElencoValori.GetValueAt(Giro)
Dim StringaHex() As String = Regex.Split(",", Valore)
Dim StringaByte(StringaHex.Length) As Byte
Dim SingoloByte() As Byte
For i = 0 To StringaHex.Length -1
SingoloByte = conv.HexToBytes(StringaHex(i).Trim.Replace("0x",""))
StringaByte(i) = SingoloByte(0)
Next
Astream.Write(StringaByte)
Log("Giro " & Giro & " Chiave " & Chiave & " - " & StringaHex )
Next

End Sub
 
Last edited:

Angelo Messina

Active Member
Licensed User
Longtime User
Questo sub
dovrebbe eseguire la lettura
la Stringa Risposta contiene le risposte dal server
se eseguito fuori da for e un comando alla volta funziona mentre con il for catturo solo alcune risposte e casuali
Nel ciclo for non mi permette di inserire il WaitFor (è B4A 6.80 )

Sub Astream_NewData(Buffer() As Byte)
Risposta = BytesToString(Buffer, 0,Buffer.Length , charset)
Log(Risposta)
timerEvento.Initialize("TimerEvento",10)
timerEvento.Enabled=True
End Sub

Sub timerEvento_Tick
Log("Timer Memorizzo " & Chiave & " " & Risposta)
timerEvento.Enabled = False
ElencoValori.Put(Chiave,Risposta)
Totalizza
DoEvents
End Sub
 
Last edited:

sirjo66

Well-Known Member
Licensed User
Longtime User
Ti confermo quello che ha scritto Star-Dust, cioè che invii i dati ma poi non stai lì ad aspettare che ti arrivi la risposta.
Dopo la riga Astream.Write(StringaByte) devi quindi entrare in un Loop ed aspettare che ti arrivi la risposta oppure puoi usare il WaitFor.
qui hai una piccola spiegazione: https://www.b4x.com/android/forum/threads/b4x-resumable-subs-sleep-wait-for.78601/

Inoltre attento che la riga
For Giro=1 To ElencoValori.Size-1
dovrebbe essere invece
For Giro=0 To ElencoValori.Size-1

Sergio
 
Last edited:

Angelo Messina

Active Member
Licensed User
Longtime User
Ok la riga è
ho provato a saltare un comando in una verifica
For Giro = 0 To ElencoValori.Size-1
 

Angelo Messina

Active Member
Licensed User
Longtime User
For Giro=0 To ElencoValori.Size-1
Chiave=ElencoValori.GetKeyAt(Giro)
Valore=ElencoValori.GetValueAt(Giro)
Dim StringaHex() As String = Regex.Split(",", Valore)
Dim StringaByte(StringaHex.Length) As Byte
Dim SingoloByte() As Byte
For i = 0 To StringaHex.Length -1
SingoloByte = conv.HexToBytes(StringaHex(i).Trim.Replace("0x",""))
StringaByte(i) = SingoloByte(0)
Next
Astream.Write(StringaByte)
Wait For Astream_NewData (Risposta As Byte)
Log("Giro " & Giro & " Chiave " & Chiave & " - " & StringaHex )
Next
 

Star-Dust

Expert
Licensed User
Longtime User
Gentilmente usa il comando CODE per nserire codice
Oppure dal menu, cosi è più leggibile

WairtFor: Credo che lo usi erroneamente
 

Angelo Messina

Active Member
Licensed User
Longtime User
B4X:
    For Giro=0 To ElencoValori.Size-1
            Chiave=ElencoValori.GetKeyAt(Giro)
            Valore=ElencoValori.GetValueAt(Giro)
            Dim StringaHex() As String = Regex.Split(",", Valore)
            Dim StringaByte(StringaHex.Length) As Byte
            Dim SingoloByte() As Byte
            For i = 0 To StringaHex.Length -1
                SingoloByte = conv.HexToBytes(StringaHex(i).Trim.Replace("0x",""))
                StringaByte(i) = SingoloByte(0)
            Next
            Astream.Write(StringaByte)
            Wait For Astream_NewData (Risposta As Byte)
            Log("Giro " & Giro & " Chiave " & Chiave & " - " & StringaHex )
       Next
 

sirjo66

Well-Known Member
Licensed User
Longtime User
non hai visto che la firma dell'evento non è la stessa ??
devi usare
B4X:
Wait For Astream_NewData(Buffer() As Byte)

l'evento riceve un array di byte, non un singolo byte
 

Angelo Messina

Active Member
Licensed User
Longtime User
ho comprato questa e 3 mesi dopo è uscita la 7, praticamente non ho avuto la possibilità di ammortizzare il costo di questa ancora.
 

sirjo66

Well-Known Member
Licensed User
Longtime User
guarda che dal momento in cui acquisti una versione hai diritto a tutti gli aggiornamenti per due anni
(dipende da che versione hai acquistato)
 

Star-Dust

Expert
Licensed User
Longtime User
Se hai la versione 6.80 non usare il ciclo for

Crea una procedura che manda avanti il ciclo solo dopo aver ricevuto i dati di conferma

Ed è possibile farlo, anche solo usando un timer. Ma ci sono molti metodi e algoritmi che puoi implementare per ottenere lo stesso risultato
 
Last edited:

Star-Dust

Expert
Licensed User
Longtime User
P.S. Perché non rispolverare il buon vecchio DoEvents....

In ogni caso io farei cosi
B4X:
Sub Ciclo
    Giro=0
    InvioDati
End Sub

Sub InvioDati
    Chiave=ElencoValori.GetKeyAt(Giro)
    Valore=ElencoValori.GetValueAt(Giro)
    Dim StringaHex() As String = Regex.Split(",", Valore)
    Dim StringaByte(StringaHex.Length) As Byte
    Dim SingoloByte() As Byte
    For i = 0 To StringaHex.Length -1
        SingoloByte = conv.HexToBytes(StringaHex(i).Trim.Replace("0x",""))
        StringaByte(i) = SingoloByte(0)
    Next
    Astream.Write(StringaByte)
   
    Giro=Giro+1
End Sub

Sub Astream_NewData (Risposta() As Byte)
    If VerificaRisposta(Risposta)=True Then
        'passa al secondo ciclo
       
        If Giro<ElencoValori.Size Then 
            InvioDati
        End If
       
        timerEvento.Initialize("TimerEvento",10)
        timerEvento.Enabled=True
    End If
End Sub

Sub VerificaRisposta(R() As Byte) As Return
    'Verificar eche sia la rispostya dal server per l'invio dati e non altri dati
    Return True
End Sub

Sub timerEvento_Tick
    Log("Timer Memorizzo " & Chiave & " " & Risposta)
    timerEvento.Enabled = False
    ElencoValori.Put(Chiave,Risposta)
    Totalizza
    DoEvents
End Sub
 
Top