la macchina remota si aspetta un valore:
A | A | 5 | 5 | 0 | 3 | 0 | 0 | 1 | F | cr+lf
composto di caratteri esadecimali ... suppongo in un unico invio separato da un CrLf
questo il codice (che ho tradotto da un mio vecchio software funzionante in vb6):
Public Sub CommutaMatrice(macchina As Integer, sorgente As Integer, destinazione As Integer)
Dim InizioStringa As String
Dim Ingresso As String
Dim Uscita As String
InizioStringa = "AA5503"
ingresso = Hex(sorgente, 2)
uscita = Hex(destinazione, 2)
Seriale.Close
With Seriale
.PortName = "/dev/" & settings["SerialPort", "ttyACM0"]
.Speed = 9600
.Parity = SerialPort.None
.DataBits = 8
.StopBits = 1
.FlowControl = 0
.Open
End With
seriale.Begin
Wait 1
Print #seriale, InizioStringa & ingresso & uscita
Wait 1
Seriale.Send
mylogger("MASTER_CONTROL:" & sorgente & ">" & destinazione & "(" & macchina & ")", Logger.Info)
seriale.Close
PlayNext
End
ho provato a cambiare il tipo di dati da string ad hex, ma hex non e' un tipo di dato riconosciuto :-(
penso &hAA5503001F per quel che riguarda il termine riga e' molto vago, penso basti che gli arrivi quella roba tutta insieme.
in allegato le schermate di minicom (indica l'invio di 5 byte). Come si concatenano i byte?
da shell questo comando funziona pefettaemnte:
echo -en '\xAA\x55\x03\x00\x1F' > /dev/ttyUSB0
In fondo l'esadecimale non è altro che una rappresentazione di un numero, quindi prova un po' così:
Public Sub CommutaMatrice(macchina As Integer, sorgente As Integer, destinazione As Integer)
Dim InizioStringa As String
InizioStringa = "AA5503"
With Seriale
.PortName = "/dev/" & settings["SerialPort", "ttyACM0"]
.Speed = 9600
.Parity = SerialPort.None
.DataBits = 8
.StopBits = 1
.FlowControl = 0
.Open
End With
Write #Seriale, Val("&" & InizioStringa) As Long
Write #Seriale, sorgente As Integer
Write #Seriale, destinazione As Integer
Seriale.Close
...etc....
End
Questa riga del mio codice:
Write #Seriale, Val("&" & InizioStringa) As Long
non va bene. E' errata: non va bene per quel che serve a te.
Chissà se c'è qualcuno che ha capito perché ?!
Poiché il primo gruppo di dati è "fisso" e di formato atipico (5 byte), dobbiamo utilizzare una porzione di memoria riservata.
Useremo per facilità un vettore di tipo Byte[ ] inizializzato con i valori iniziali da passare alla macchina remoto.
Veniamo ora al comando di commutazione, che necessita di un indirizzo per la sorgente (1 byte=255 sorgenti) e della destinazione (1 byte).
Se il valore della sorgente e quello della destinazione occupanno 1 Byte ciascuno, allora alla macchina bisogna passare un valore di tipo Byte e non Integer.
Proporrei quindi questa soluzione:
Public Sub CommutaMatrice(macchina As Integer, sorgente As Byte, destinazione As Byte)
Dim iniziale As Byte[] = [&AA, &55, &03, &00, &1F]
With Seriale
......
......
End With
iniziale.Push(sorgente)
iniziale.Push(destinazione)
iniziale.Write(Seriale, 0, iniziale.Count)
Seriale.Close
......
......
End
perfetto! funziona !
Public Sub CommutaMatrice(macchina As Integer, sorgente As Integer, destinazione As Integer)
Dim Ingresso As Byte
Dim Uscita As Byte
Dim iniziale As Byte[] = [&AA, &55, &03]
ingresso = CByte(sorgente)
uscita = CByte(destinazione)
iniziale.Push(ingresso)
iniziale.Push(uscita)
If seriale.Status = Net.Active Then
Seriale.Close
Endif
With Seriale
.PortName = "/dev/" & settings["SerialPort", "ttyACM0"]
.Speed = 9600
.Parity = SerialPort.None
.DataBits = 8
.StopBits = 1
.FlowControl = SerialPort.None
.Drop
.Open
End With
If seriale.Status = Net.Active Then
iniziale.Write(Seriale, 0, iniziale.Count)
mylogger("MASTER_CONTROL:" & sorgente & ">" & destinazione & "(" & macchina & ")", Logger.Info)
seriale.Close
Endif
PlayNext
End