Italian Aumentare tempo di risposta AsyncStream

FreeWolF

Active Member
Licensed User
Longtime User
Ciao, con la funzione asyncstream, riesco a mandare e a ricevere dati da un'apparecchiatura. I dati vendono inviati correttamente ma A VOLTE, la risposta dell'pparecchiatura, risulta tagliata, cioè, la risposta è un pò lenta e viene tagliata in due parti, così io riesco a visualizzarne solo la seconda parte. E' possibile mettere un delay o qualcosa del genere al momento della ricezione del buffer?
 

FreeWolF

Active Member
Licensed User
Longtime User
...nessuna idea? Ho provato a dare un'occhiata al tutorial sulle reti (network tutorial) ma non sono riuscito a venirne a capo....
 

FreeWolF

Active Member
Licensed User
Longtime User
Ciao Luca, grazie per la risposta!

Purtroppo no, non riesco ad aggiungere un codice, inoltre i dati che ricevo finiscono sempre con una "cifra" diversa a causa del calcolo del checksum della stringa.

Ho provato tempo fa a postare qualcosa a riguardo nel forum inglese (Questions), mi è stato solo detto di dare un'occhiata al tutorial "network" e così ho fatto, ma senza risultati.

In tutti i casi domani a mente fresca ci riprovo, magari mi viene in mente qualcosa
 

FreeWolF

Active Member
Licensed User
Longtime User
Ho provato in due modi:

B4X:
Sub AStreams_NewData (Buffer() As Byte)

 If Buffer.Length > 0 Then
       ToastMessageShow("ok", False)
 Else
       ToastMessageShow("no", False)
 End If


Dim bytes As String

bytes = Converter.HexFromBytes(Buffer)

EditText1.Text = bytes


End Sub

E in questo modo ricevo solo una stringa spezzata (cioè o la partecentrale o quella finale della stringa inviata dallo strumento)

Ho provato anche questo codice:

B4X:
Sub AStreams_NewData (Buffer() As Byte) 
   
   
    If Buffer.Length > 0 Then
        ToastMessageShow("ok", False)
    Else
        ToastMessageShow("no", False)
    End If
   
    Dim lista As List
    lista.Initialize
   
      lista.Add(Buffer)       
                   
       
    EditText1.Text = lista
           
   
End Sub

Ma non sembra funzionare nemmeno così :( Avevo pensato di usare la funzione FOR, magari scrivendo qualcosa tipo "FOR each byte in buffer lista.add(buffer)", ma sinceramente non saprei come "scrivere" una cosa del genere
 

IlCasti

Active Member
Licensed User
Longtime User
Se vuoi ciclare la list

B4X:
For I = 0 to Lista.size-1
    'ISTRUZIONE
Next

Ma quando redimmi e reinizializzi la list, accoda il buffer a quello precedente nella posizione successiva?
Ciao

IlCasti
 

FreeWolF

Active Member
Licensed User
Longtime User
Ciao grazie per la risposta!

Ora ho scritto il tutto in questo modo:

B4X:
Sub AStreams_NewData (Buffer() As Byte) 'in questa sub devo dire cosa fare con i dati che MI ARRIVANO dallo strumento
  
  
    If Buffer.Length > 0 Then 'i dati vengono scritti dentro a Buffer() ora indico (a scopo di debug) se il buffer è vuoto oppure c'è qualcosa
        ToastMessageShow("ok", False)
    Else
        ToastMessageShow("no", False)
    End If
  
    For I = 0 To lista.size-1
        lista.AddAll(Buffer)
    Next
  
      
    EditText1.Text = lista
  
  
  
End Sub

La edittext visualizza un carattere strano, ma probabilmente è perchè non ho convertito i bytes in esadecimali. Se provo a usare la libreria byteconverter (convert.hexfrombytes) mi dice che è impossibile convertire il tipo di dato.

Non so che cosa intendi per "redimmare" la lista, scusa la mia ignoranza :)

Edit: con il codice scritto sopra la lista non viene "popolata" ma rimane vuota
 

IlCasti

Active Member
Licensed User
Longtime User
Potresti (chiunque si senta libero di correggere è!):

Nella sub Globals dovresti fare la Dim della Lista
Nella Activity_Create l'initialize

B4X:
Sub AStreams_NewData (Buffer() As Byte)         
  If Buffer.Length > 0 Then
    ToastMessageShow("ok", False)   
  Else
    ToastMessageShow("no", False)
  End If
 
  lista.Add(Buffer)
End Sub

Poi in un'altra sub cicli la Lista e la inserisci dove vuoi.

Che te ne sembra?

Ciao
IlCasti
 

FreeWolF

Active Member
Licensed User
Longtime User
La Dim della lista e l'inizializzazione li ho già fatti, subito infatti sbagliavo perchè facevo tutto nella sub Astreams_NewData. Ora, con la funzione lista.size in effetti vedo che alcuni elementi vengono scritti. Come posso scrivere la sub per cliclare la lista? Porta pazienza eh, sono un pò duro e ho il cervello in pappa....

Edit: sono riuscito a mettere 3 elementi dentro alla lista, effettivamente sembra che vadano bene, ora prova a concatenarli così:

B4X:
Dim pippo As String
   
    pippo = lista.Get(0) & lista.Get(1) & lista.Get(2)

E dovrei ottenere la stringa con tutti gli elementi della lista concatenati. Ora , visto che sono bytes, devo convertire questa "stringa" in esadecimale
 
Last edited:

IlCasti

Active Member
Licensed User
Longtime User
Da quanto ho capito non riesci ad intercettare la fine dell'invio dati
Non ho mai usato l'async quindi ci vado con i piedi di piombo
Sul tempo ti devi regolare per lanciare la sub AcchiappoIDati

Potresti fare qualcosa del tipo:

B4X:
'Nella Globals
Dim StringaBuffer as string
B4X:
Sub AStreams_NewData (Buffer() As Byte)
  If Buffer.Length > 0 Then
    ToastMessageShow("ok", False)
  Else
    ToastMessageShow("no", False)
  End If
  lista.Add(Buffer, 0, Buffer.Length, "UTF8"))
End Sub
B4X:
Sub AcchiappoIDati
  For I = 0 To lista.size-1
    StringaBuffer = StringaBuffer & lista.get(I)
  Next
  ToastMessageShow(StringaBuffer, False)
End sub

Ciao
IlCasti
 

FreeWolF

Active Member
Licensed User
Longtime User
Ti ringrazio tantissimo per l'aiuto! In effetti si, non riesco ad intercettare l'inizio e la fine dell'invio dei dati, conosco solo l'inizio, che in esadecimale è "0103" e questa è una cosa fissa. La fine della stringa è variabile, nel senso che ogni volta,visto che arriva con un checksum calcolato in modo diverso, non posso dire "quando arriva il dato x la ricezione dei dati è terminata".

Nell' esempio che hai scritto alla voce "lista.Add(Buffer, 0, Buffer.Length, "UTF8")" mi dice che ci sono troppi parametri.

Grazie ancora, davvero!!!
 

LucaMs

Expert
Licensed User
Longtime User
Intanto, io pensavo che tu ricevessi i primi dati e perdessi gli ultimi, non viceversa. (stavo già scrivendo ed è arrivata adesso la tua risposta sopra).

Poi, dalle prove che fai, sembra che tu sia convinto di ricevere i dati giusti ma che non riesci a recuperarli tramite codice.

1) assicurati di ricevere la quantità esatta di dati:

Sub AStreams_NewData (Buffer() AsByte)
Log(Buffer.Length)
...

2) se è giusta, per la conversione potresti provare ad usare RandomAccessFile (guarda come funziona in KeyValueStore)
 
Last edited:

FreeWolF

Active Member
Licensed User
Longtime User
Non ho scritto "Log(Buffer.Lenght)", ma ho provato con Edittext1.text = Buffer.Lenght.

Subito compare il numero 10 e dopo un attimo il numero 6. Quindi direi di ricevere il buffer in entrata in 2 volte per un totale di 16 bytes (correggimi se sbagllio).
Corro a dare un'occhiata a RandomAccessFile.


Visto che so che il buffer in ricezione è di 16 bytes, potrei provare a fare un ciclo con while
 
Last edited:

FreeWolF

Active Member
Licensed User
Longtime User
La stringa è in totale di 17 bytes. Ora questo è sicuro. l' inizio della stringa FISSO ed il valore sarà sempre questo è: 01030C

Ora. devo leggere una stringa di 17 bytes dall' inizio alla fine. Almeno questo ora lo so :)
 

IlCasti

Active Member
Licensed User
Longtime User
Scusa avrei dovuto scrivere

BytesToString(Buffer, 0, Buffer.Length, "UTF8")
 

FreeWolF

Active Member
Licensed User
Longtime User
Rieccomi :)

Alla fine penso di esserci riuscito, o almeno, PER IL MOMENTO sembra andare. In pratica alla ricezione dei dati in etrata li scrivo dentro ad una lista, poi faccio un append del primo dato della lista in un'altra variabile e resetto la lista, fa così per ogni byte ricevuto ed effettivamente funziona. Mi rendo conto che è piuttosto laboriosa come cosa e sicuramente ci saranno 1000 modi migliori, ma l' importante è che adesso funzioni. Poi in futuro sistemerò il tutto :)

Domani al lavoro riprovo a scrivere come hai detto tu IlCasti.

Grazie ancora a tutti!!!
 
Top