Autore Topic: [SOLVED] Come scrivere (e mandare) dati esadecimali attraverso la seriale rs232?  (Letto 1618 volte)

Offline allegfede

  • Gran Maestro dei Gamberi
  • *****
  • Post: 738
    • Mostra profilo
Re:Come scrivere (e mandare) dati esadecimali attraverso la seriale rs232?
« Risposta #15 il: 24 Aprile 2019, 14:16:40 »
sono i valori esadecimali FISSI

Forse vuole questi: 170  85  3  0  31
e non un byte di più.
Cioè "singoli" byte, che solo insieme assumono un significato per la macchina remota.  :-X

cerco di spiegare il protocollo di comunicazione verso la macchina:
la macchina remota riconosce un comando se riceve 5 byte i cui primi due sono
AA 55

A questo punto, dei 5 byte che riceve analizza il terzo byte (8 bit) che rappresenta i moduli attivi (l'esadecimale 03 e' in binario 00000011, che significa, partendo da DESTRA, modulo video composito presente TRUE (1) | modulo audio presente TRUE (1) | modulo Y/C o RGB presente=FALSE (0) | modulo audio 2 presente=FALSE (0) , etc)

Veniamo ora al comando di commutazione, che necessita di un indirizzo per la sorgente (1 byte=255 sorgenti) e della destinazione (1 byte).

quindi da minicom (tanto per capire dove la cosa funziona), la "stringa" che rappresenta (attraverso il drop down menu' opportuno si mette HEX) valori esadecimali, AA5503001F (e do invio o premo send), sto dicendo al modulo video ad al modulo audio (binario 11=esadecimale 03) che sto inviando un comando di commutazione (esadecimale AA55) tra' la sorgente (esadecimale 00= in decimale 0) e la destinazione (esadecimale 1F= decimale 31).

I valori decimali ci sono perche' la "pulsantiera" per il controllo manuale e' ovviamente in numeri a base dieci, piu' vicini all'esperienza umana.

Per venire all'argomento "cosa e' parametrico e cosa e' fisso", direi che i primi 3 byte del comado possono essere hard-coded poiche' cambieranno molto poco, ma sorgente e destinazione vengono scelti di volta in volta dall'utente e devono essere un parametro.
« Ultima modifica: 24 Aprile 2019, 14:21:10 da allegfede »
se corri, morirai stanco (motto degli sniper)

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.309
  • Ne mors quidem nos iunget
    • Mostra profilo
Re:Come scrivere (e mandare) dati esadecimali attraverso la seriale rs232?
« Risposta #16 il: 24 Aprile 2019, 15:20:03 »
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:
Codice: [Seleziona]
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
« Ultima modifica: 24 Aprile 2019, 15:43:48 da vuott »
« Chiunque, non ricorrendo lo stato di necessità, nel proprio progetto Gambas fa uso delle istruzioni Shell o Exec, è punito con la sanzione pecuniaria da euro 20,00 a euro 60,00. »

Offline allegfede

  • Gran Maestro dei Gamberi
  • *****
  • Post: 738
    • Mostra profilo
Re:Come scrivere (e mandare) dati esadecimali attraverso la seriale rs232?
« Risposta #17 il: 24 Aprile 2019, 16:20:21 »
perfetto! funziona !
Codice: [Seleziona]
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
« Ultima modifica: 24 Aprile 2019, 17:46:12 da allegfede »
se corri, morirai stanco (motto degli sniper)

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.309
  • Ne mors quidem nos iunget
    • Mostra profilo
Re:Come scrivere (e mandare) dati esadecimali attraverso la seriale rs232?
« Risposta #18 il: 24 Aprile 2019, 18:42:18 »
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.

Oltre al problema del passaggio dei primi tre dati come tipo Stringa, si aggiungeva anche il passaggio degli ultimi due dati (sorgente e destinazione) come tipo Integer anziché come Byte.

Sappiamo infatti che il tipo Intero occupa 4 byte di memoria, pertanto se - ad esempio - il valore "sorgente" da trasmettere fosse stato semplicemente &61 e quello "destinazione" fosse stato &71, passando l'Integer tu avresti passato con Write (in Little-Endian) &61 &00 &00 &00 &71 &00 &00 &00.
In definitiva tu avresti passato - nell'esempio didattico sopra mostrato - i seguenti valori significativi per la macchina remoto:
&AA &55 &03 &61 &00
« Chiunque, non ricorrendo lo stato di necessità, nel proprio progetto Gambas fa uso delle istruzioni Shell o Exec, è punito con la sanzione pecuniaria da euro 20,00 a euro 60,00. »