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

Offline allegfede

  • Gran Maestro dei Gamberi
  • *****
  • Post: 738
    • Mostra profilo
Salve, ho scritto una procedura che dovrebbe mandare una serie di valori esadecimali ad una macchina attraverso la seriale rs232 ma ho il sospetto che stia mandando la interpretazione ASCII di quelle cifre.
Per esempio dovrebbe mandare l'esadecimale a5 30 00 11 1f , ma penso che mandi "a53000111f".
So che il cavo ed il collegamento funziona, perché con miniComm quando mando in esadecimale quei valori, la macchina remota mi risponde.

Ora sono a casa e non ho il codice, domani lo carico.

Ma non ho trovato alcuna informazione sul fatto che serial.send invii i dati del butteremo in un modo (ASCII) o nell'altro (esadecimale).
« Ultima modifica: 24 Aprile 2019, 16:35:10 da allegfede »
se corri, morirai stanco (motto degli sniper)

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.720
  • Ne mors quidem nos iunget
    • Mostra profilo
Per esempio dovrebbe mandare l'esadecimale a5 30 00 11 1f , ma penso che mandi "a53000111f".
Cioè di quel numero deve inviare un byte alla volta in serie ?
« 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 Arco

  • Gambero
  • **
  • Post: 93
    • Mostra profilo
Non capisco alcune cose.
Il computer riconosce solo il codice binario.
Tu hai un convertitore esadecimale -> binario per inviare i dati alla seriale?
Un convertitore binario -> esadecimale sulla seriale di destinazione?
In questo caso un segnale inviato è uguale al segnale ricevuto.

Offline kicco

  • Senatore Gambero
  • ******
  • Post: 1.728
  • So dove andare, seguitemi, ci perderemo insieme!
    • Mostra profilo
 :ciao:
Secondo me stai facendo confusione.
Se i valori a5 30 00 11 1f sono esadecimali, la seriale li invia così come sono. È il ricevente che deve sapere che i dati sono esadecimali e non decimali (ASCII).
La domanda che ti ha posto Vuott è importante perchè se il ricevente legge un dato alla volta, il gioco è fatto altrimenti se gli arriva la stringa "a5 30 00 11 1f ", bisogna provvedere alla divisione dei vari byte.
Tutto questo ovviamente se ho capito bene il tuo quesito!!!
 :ciao: :ciao:
Chi ha paura muore ogni giorno, chi non ha paura muore una volta sola. (Paolo Borsellino)

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.720
  • Ne mors quidem nos iunget
    • Mostra profilo
se gli arriva la stringa "a5 30 00 11 1f ", bisogna provvedere alla divisione dei vari byte.
Se gli arriva quella stringa, la stringa sarà "a53000111f" e non "a5 30 00 11 1f ", giacché in tale secondo caso anche lo spazio è un dato, corrispondente al valore &h20 (d32).
Pertanto, la stringa "a53000111f" è formata da ben 10 valori ASCII corrispondenti ciascuno a un carattere alfanumerico ivi contenuto.
Comprenderete, dunque, la complessità di trasformare due byte, ad esempio &h61 &h35 (ossia "a5") nell'unico valore &ha5.
« Ultima modifica: 24 Aprile 2019, 11:49:09 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
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):
Codice: [Seleziona]
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 :-(
« Ultima modifica: 24 Aprile 2019, 12:19:58 da allegfede »
se corri, morirai stanco (motto degli sniper)

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.720
  • Ne mors quidem nos iunget
    • Mostra profilo
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

Prima questione che devi farci capire.

La macchina remota si aspetta &hAA &h55 &h03 &h00  &h1F &h06 ?
« 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
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:
Codice: [Seleziona]
echo -en '\xAA\x55\x03\x00\x1F' > /dev/ttyUSB0
« Ultima modifica: 24 Aprile 2019, 13:27:03 da allegfede »
se corri, morirai stanco (motto degli sniper)

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.720
  • Ne mors quidem nos iunget
    • Mostra profilo
penso &hAA5503001F ...... penso basti che gli arrivi quella roba tutta insieme.
...ma poi ci devi aggiungere i valori di "ingresso" e "uscita" ?
« 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 vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.720
  • Ne mors quidem nos iunget
    • Mostra profilo
In fondo l'esadecimale non è altro che una rappresentazione di un numero, quindi prova un po' così:

Codice: [Seleziona]
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
« Ultima modifica: 24 Aprile 2019, 13:34:40 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 vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.720
  • Ne mors quidem nos iunget
    • Mostra profilo
Re:Come scrivere (e mandare) dati esadecimali attraverso la seriale rs232?
« Risposta #10 il: 24 Aprile 2019, 13:35:56 »
Seconda questione:

...ma InizioStringa deve essere per forza di tipo.... Stringa ? 
« 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 vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.720
  • Ne mors quidem nos iunget
    • Mostra profilo
Re:Come scrivere (e mandare) dati esadecimali attraverso la seriale rs232?
« Risposta #11 il: 24 Aprile 2019, 13:40:24 »
Questa riga del mio codice:

Codice: [Seleziona]
   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é ?!
« Ultima modifica: 24 Aprile 2019, 13:42:25 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 #12 il: 24 Aprile 2019, 13:42:12 »
Seconda questione:

...ma InizioStringa deve essere per forza di tipo.... Stringa ?

noo assolutamente ... sono i valori esadecimali FISSI per la mia architettura di macchine (e' fatta a moduli e quei valori dicono a quali moduli e' associato il comando che seguira')
se corri, morirai stanco (motto degli sniper)

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.720
  • Ne mors quidem nos iunget
    • Mostra profilo
Re:Come scrivere (e mandare) dati esadecimali attraverso la seriale rs232?
« Risposta #13 il: 24 Aprile 2019, 13:49:05 »
noo assolutamente ... sono i valori esadecimali FISSI

Cerchiamo di capirci.

Come sappiamo, i valori esadecimali non sono altro che una diversa "rappresentazione" di un numero.

DOMANDONA:

tu devi inviare quei precisi valori-byte, e SOLO strettamente quelli ? OPPURE tu devi inviare dei numeri formati da più cifre.

Cerco di spiegarmi meglio:
Tu hai scritto: &hAA5503001F

ma......la macchina remoto vuole questi valori (te li scrivo in Decimale): 170  85  3  0  31 ?
oppure vuole questo: 731570700319 ?
« 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 vuott

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