Devo comunicare con uno strumento elettronico, per fare ciò gli invio un array di bytes tramite Asyncstream e funziona tutto correttamente (risposta dello strumento inclusa).
Per fare ciò uso questo codice:
B4X:
Sub Server_NewConnection (Successful AsBoolean, NewSocket AsSocket)
AStreams.Initialize(Socket1.InputStream, Socket1.OutputStream, "AStreams")
If Successful Then
Socket1 = NewSocket
AStreams.write(ArrayAsByte(0x16, 0x08, 0x00, 0x00, 0x00, 0x00, 0xE3, 0x2C))
ToastMessageShow("Dati inviati",True)EndIf
Server.Listen
Ora, il problema è che io vorrei "personalizzare" la stringa che invio allo strumento.
La stringa che invio è: 0x16, 0x08, 0x00, 0x00, 0x00, 0x00, 0xE3, 0x2C ho provato a scivere questo:
B4X:
Sub Server_NewConnection (Successful AsBoolean, NewSocket AsSocket)
AStreams.Initialize(Socket1.InputStream, Socket1.OutputStream, "AStreams")
If Successful Then
Socket1 = NewSocket
Edittext1.text = "0x16, 0x08, 0x00, 0x00, 0x00, 0x00, 0xE3, 0x2C"
AStreams.write(Edittext1.text)
Ma così non funziona.
Ho anche provato a scrivere la stringa così:
B4X:
AStreams.write(ArrayAsByte(Edittext1.text))
Ma non funziona nemmeno così.
Insomma, io dovrei prendere un valore scritto in decimale da una Edittext, convertirla da decimale a esadecimale, inserire il valore ottenuto aggiungendo magari "0x" davanti e metterlo nell'array di dati che vado ad inviare.
EditText1.Text = "0x16, 0x08, 0x00, 0x00, 0x00, 0x00, 0xE3, 0x2C"
EditText2.Text = "22"
EditText3.Text = "227"
EditText4.Text = "44"
Dim a,b,c As String
a = Bit.ToHexString(EditText2.Text)
b = Bit.ToHexString(EditText3.Text)
c = Bit.ToHexString(EditText4.Text)
EditText1.Text = a & " " & b & " " & c
Dim a1,a2,a3 As String
a1 = Bit.ParseInt(a,16)
a2 = Bit.ParseInt(b,16)
a3 = Bit.ParseInt(c,16)
EditText5.Text = a1 & " " & a2 & " " & a3
Con questo metodo, posso convertire i dati esadecimali che spedisco allo strumento in integer che andrò a visualizzare nelle edittext e viceversa, da interi a esadecimali.
Ora, come faccio ad inserire i dati convertiti in esadecimale (o Bytes, sto facendo un pò di confusione) in questa stringa:
Dim HexString() As String = Regex.Split(", ", Edittext1.text)
Dim arrByte(8) As Byte
For i = 0 To 7
arrByte(i) = HexString(i)
Next
AStreams.write(arrByte)
Purtroppo con l'esempio che mi hai scritto non funziona, ricevo il seguente errore:An Error has occured in sub: java.lang. NumberFormatException: Invalid hex double:0x01 Continue?
Sub Globals
'These global variables will be redeclared each time the activity is created.
'These variables can only be accessed from this module.
Private conv As ByteConverter
End Sub
Sub Activity_Create(FirstTime As Boolean)
Edittext1.text = "0x16, 0x08, 0x00, 0x00, 0x00, 0x00, 0xE3, 0x2C"
Dim HexString() As String = Regex.Split(", ", Edittext1.text)
Dim arrByte(HexString.Length) As Byte
Dim b() As Byte
For i = 0 To HexString.Length - 1
b = conv.HexToBytes(HexString(i).SubString(2))
arrByte(i) = b(0)
Next
AStreams.write(arrByte)
End Sub
Grazie per l'aiuto, tra dieci minuti provo e poi ti dico se funziona o meno. Potrebe darsi che riuscirò a non dover mettere gli "0x" davanti, ma per adesso se funziona tutto va bene così
Sub Activity_Create(FirstTime As Boolean)
Edittext1.text = "0x16, 0x08, 0x00, 0x00, 0x00, 0x00, 0xE3, 0x2C"
Dim HexString() As String = Regex.Split(",", Edittext1.text)
Dim arrByte(HexString.Length) As Byte
Dim b() As Byte
For i = 0 To HexString.Length -1
b = conv.HexToBytes(HexString(i).Trim.Replace("0x",""))
arrByte(i) = b(0)
Next
AStreams.write(arrByte)
End Sub
Rimando la prova del tuo codice perchè naturalmente quando c'è fretta capitano sempre tutte, ora gli Ingenieri hanno aggiornato il software dello schedino Wifi e nonsi connette più...devo aspettare che risolvano.....
OK, ho risolto tutto, ora funziona SENZA PROBLEMIIIIIIIIIIIIIII GRAZIEEEEEEEEEEEEEEEEEEEEEEEEE!!!!!
Vi devo una birra.
Chiedo solo l'ultima cosa, poi per un pò spero di non farmi più sentire per richieste di aiuto
Lo strumento risponde correttamente, però la risposta è un pò lenta e viene "spezzata" in due parti. Io naturalmente mi trovo solo la seconda parte. Come si fa per "aumentare" il tempo di attesa e di riempimento del buffer in entrata della funzione asyncstream?