Forum >> Principianti >> Conversione ASCII a HEX II puntata prosecuzione

Pagina: 1

Intanto Ti ringrazio per il tempo che dedichi

La non breve
carriera passata a scrivere programmi per macchine automatiche mi ha

insegnato *** qui avevo fatto la battuta circa la necessità di dover imparare a nuotare; non vorrei mai :)

Per cui ho sezionato l'intera stringa e sostituito il punto cruciale col un \xf0

Un altro punto ostico era la lunghezza del testo a cui ovvierò allo stesso modo ricavando i caratteri necessari in questo modo:
********************
import binascii
num = 255 # numero da sostituire per le varie prove
nume = hex(num)
print(nume)
a = nume.encode()
print(a)
b = str(a)
c = b[:-1] # tolgo ' a destra
c = c[4:] # tolgo b'0x a Sinistra
# ricostruisco la stringa come va bene a me
if len(c) > 1 :
c = 'x' + c
else :
c = 'x0' + c
c = "\\" + c
print(c) # c sarà \xff

*******************

Da qui ne viene la Max lunghezza messaggio




Dimmi pure che sono fuori fase ma per me basta che funzioni
All'alba dei 75 anni ...... ;) :)

Allegherò una immagine del famigerato SoundModem

Fatta la prova col 240 in doppio byte \xc3\xb0 ma no lo accetta

Adesso mi dedicherò al socket e sicuramente tornerò a scassare l'anima

Grazie ancora
--
Bruno L.
Pietro Bruno Lancerotto said @ 2024-02-03 17:16:49:
c = "\\" + c
print(c) # c sarà \xff
Purtroppo non funziona perchè alla fine quel c deve essere
b'\xff'
nella parte del 240 funziona perché c'è un

x2 = b'\xf0' scritto così brutalmente





nel caso di un valore 2 si ha

0x2 Valore esadecimale del numero
b'0x2' risultato di encode

purtroppo a me serve


b'x02'

Altrimenti chi riceve la stringa non la "digerisce"




Qualche suggerimanto ??





--- Ultima modifica di Pietro Bruno Lancerotto in data 2024-02-03 20:43:37 ---
--
Bruno L.
La parte riguardante il "c" non l'ho capita dato che:
Python 3.10.12 (main, Nov 20 2023, 15:14:05) [GCC 11.4.0] on linux
Type "help", "copyright", "credits" or "license()" for more information.
value = b'\xff'
int.from_bytes(value, 'little')
255
chr(255)
'ÿ'
Cosa era quello "c" cui riferisci?


Riguardo al "2":
value = 2
value.to_bytes(1, 'little')
b'\x02'
forse, c'è un po' di fretta in giro.

Comunque, è un po' difficile starTi dietro su di un discorso che non si conosce, hai qualche link alla documentazione di ciò che Ti occorre? ... giusto per farsi una idea, al momento le idee sono molto vaghe.


Ciao




Edit: forse ho compreso quel "c", ricade nella manipolazione del post prima ... restando genericamente nell'ambito dei numeri interi senza segno invece di quella "elaborazione" farei qualcosa del genere :

Python 3.10.12 (main, Nov 20 2023, 15:14:05) [GCC 11.4.0] on linux
Type "help", "copyright", "credits" or "license()" for more information.
value = 12500
length = value.bit_length() // 8 if not value.bit_length() % 8 else 1 + value.bit_length() // 8
value.to_bytes(length, 'little')
b'\xd40'
la documentazione correlata può essere d'aiuto




--- Ultima modifica di nuzzopippo in data 2024-02-03 22:53:42 ---
Fatti non foste a viver come bruti...
Comunque, è un po' difficile starTi dietro su di un discorso che non si conosce, hai qualche link alla documentazione di ciò che Ti occorre? ... giusto per farsi una idea, al momento le idee sono molto vaghe.
Ricapitolo un po'


Si tratta di inviare verso un programma ( SoundModem ) una stringa codificata in un certo modo

PS: il tracciato complessivo

\x00\x00\x00\x00\x4d\x00\xf0\x00 <- intestazione (fissa)

\x4e\x4f\x56\x45\x47\x31 <- mittente da 6 byte

\x00\x00\x00\x00 <- separatore (fisso)

\x41\x4c\x4c\x31\x32\x33 <- destinatario da 6 byte

\x00\x00\x00\x00 <- separatore (fisso)

\x06 <- dimensione messaggio
massimo 256 caratteri

\x00\x00\x00\x00\x00\x00\x00 <- separatore (fisso)

\x63\x69\x61\x6f\x31 <- messaggio (ciao1)

\x0d <- chiusura





Cosa faccio io



intes = chr(0)+chr(0)+chr(0)+chr(0)+chr(77)+chr(0)+chr(240)+chr(0)

mittente = "NOVEG1"

separatore = chr(0)+chr(0)+chr(0)+chr(0)

destinatario = "ALL123"

num = len(messaggio)

lunghezza = str(num)

print(lunghezza)

separ7 = chr(0)+chr(0)+chr(0)+chr(0)+chr(0)+chr(0)+chr(0)

chiusura = chr(13)

k = intes + mittente + separatore + destinatario + separatore + chr(num) + separ7 + messaggio + chiusura

request = k.encode()

print("generata", request)






Problema 1

chr(240) viene codificato in 2 byte lui ne vuole

Risolto taroccando la stringa dividendola in 2 parti e infilandoci in mezzo


x2 = b'\xf0'

e dipoi


x4 = x1 + x2 + x3

request = x4








Problema 2

La lunghezza della stringa adesso la passo con chr(num)

perchè come si capisce lui aspetta un carattere ed interpreta come lunghezza il valore decimale del caraattere che a rigor di logica dovrebbe essere inviato in esadecimale

Tutto dovrebbe essere esadecimale ma la cosa funziona lo stesso





Alla fine viene inviato questo e funziona col limite della lunghezza a 127 altrimenti si cade nei 2 byte ma a me i 127 caratteri bastano


\x00\x00\x00\x00M\x00\xf0\x00NOVEG1\x00\x00\x00\x00ALL123\x00\x00\x00\x00\x05\x00\x00\x00\x00\x00\x00\x00Ciao1\r




Allego una immagine del famigerato Suondmodem




Vi ringrazio infinitamente per la pazienza

--
Bruno L.
Allegati
Accidenti

value = 240
value.to_bytes(1, 'little')
b'\xf0'
Funziona anche il 240 :confused: :confused:
Rifaccio tutto

Vi assicuro di aver consumato gli occhi sul monitor alla ricerca di questo
E su PYTHON Guida Completa non ho trovato nulla di ciò


--- Ultima modifica di Pietro Bruno Lancerotto in data 2024-02-04 11:10:15 ---
--
Bruno L.
Pietro Bruno Lancerotto said @ 2024-02-04 11:08:15:
Rifaccio tutto

Alla fine ho fatto questo :




inte1 = chr(0)+chr(0)+chr(0)+chr(0)+chr(77)+chr(0)
intes3 = chr(0)
mittente = "NOVEG1"
separatore = chr(0)+chr(0)+chr(0)+chr(0)
destinatario = "ALL123"
num = len(messaggio)
print("Lunghezza: ",lunghezza)
separ7 = chr(0)+chr(0)+chr(0)+chr(0)+chr(0)+chr(0)+chr(0)

b_inte1 = inte1.encode()
values = 240
b_inte2 = values.to_bytes(1,'little')
b_inte3 = intes3.encode()
b_mitte = mittente.encode()
b_separ = separatore.encode()
b_desti = destinatario.encode()
b_lungh = num.to_bytes(1,'little')
b_sepa7 = separ7.encode()
b_messa = messaggio.encode()
values = 13
b_fine = values.to_bytes(1,'little')

request = b_inte1 + b_inte2 +b_inte3 + b_mitte + b_separ + b_desti + b_separ + b_lungh + b_sepa7 + b_messa + b_fine





Ringrazio tutti per l'aiuto

Purtroppo non trovo un Mentore qui in Alto Vicentino




Dovendo aprire e mantenere aperto un Socket che deve accettare quanto spedito ( ma fin qui ci sono ), dovrà anche rimanere in ascolto su quanto arriverà

chiedo consiglio su cosa devo "STUDIARE"

Link e tutorial ... bon tutto




Grazie ancora

--
Bruno L.
Pietro Bruno Lancerotto said @ 2024-02-04 13:40:07:
Dovendo aprire e mantenere aperto un Socket che deve accettare quanto spedito ( ma fin qui ci sono ), dovrà anche rimanere in ascolto su quanto arriverà
chiedo consiglio su cosa devo "STUDIARE"
Ma con quanto hai fatto su, Ti sei connesso?




Per quanto riguarda i socket sono un argomento complesso, la base di partenza minimale è la documentazione, oltre, naturalmente, una robusta infarinatura su reti e protocolli di rete (UDP e TCP-IP almeno) in rete puoi trovare esempi (in genere semplici) sullo stabilire connessioni con detti protocolli, se devi utilizzare i socket Ti conviene studiarli un po' con esempi "normali" per acquisirli quanto più riesci ... è un argomento complesso, questo.

In ogni caso, una volta stabilita una connessione i socket rimangono in ascolto sin quando uno dei due non chiude.




Ho guardato l'immagine da Te fornita, è esattamente quella che avevo già messo in link, nella pagina ci sono varie risorse tra cui, credo un terminale (easyterm49.zip), forse, Ti potrebbe essere utile? Comunque, ho scaricato la guida in inglese, specifica che l'applicazione è basata sul del protocollo ax.25, scaricare da questa pagina specifiche del layer 2 non sarebbe una brutta idea.

Non ho trovato sulla guida e ne sito esempi relativi alla connessione con quel software, probabilmente Tu li hai, dato che sai già cosa vuoi ottenere, almeno personalmente non ho idea del Tuo problema, le Tue spiegazioni non le ho comprese, probabilmente per miei limiti.




Ciao

Fatti non foste a viver come bruti...
Ma con quanto hai fatto su, Ti sei connesso?
Certamente

naturalmente, una robusta infarinatura su reti e protocolli di rete (UDP e TCP-IP almeno)

Diciamo che in parte sono stati parte del mio lavoro

2 robot con CN slave collegati al Master nonchè HMI , tutto rigorosamente Wireless 5 GHz

Gli stessi Robot collegati ad un convertitore RS232<->Ethernet per il monitoraggio della consolle

Un groviglio di porte dato il numero di canali di comunicazioni in gioco


Ormai anche il più banale PLC ha abbandonato la RS232





Visto che citi Term.exe io uso SuondModem a casa su un RTX ed il Term in remoto collegandomi tramite PortForwarding sul router al PC casalingo

Il tutto per poter far le prove in autonomia con una doppia sessione di Term in esecuzione sul remoto


Diciamo che IP e Porte ovviamente li conosco





Purtroppo quel Term.exe serve per l'APRS dei radioamatori

A me serve un terminale specifico per fare quello che serve a me e che ovviamente si connette al SoundModem che farà la trasmissione Packet in AX25




In ogni caso, una volta stabilita una connessione i socket rimangono in ascolto sin quando uno dei due non chiude.

Per trasmettere la cosa è "semplice"


clientSocket.send(request)

print("FINE TRASMISSIONE")



E funziona




Chiaramente la parte ricevente deve essere nel LOOP in modo che continui a verificare l'arrivo di caratteri ed è qui che casca l'asino ( cioè io )

Ci sono alcune postazioni che trasmettono e ricevono; l'arrivo riceve ma invia messaggi di servizio




Il sistema serve a controllare una gara che senza quello che stò facendo ci costringe ad usare un foglio di calcolo predisposto opportunamente ed andare di Seleziona tutto, copia ed incolla sul Term

L'autosave del Log sul Term non funziona e questo è un altro problema perchè il salvataggio normale non Appende, sicchè sempre un file nuovo ( Log1 Log2 )

Le persone addette poi non sono dei gran geni :confused: :(

Un aggiustamento del Term lo vedo impossibile. L'autore è Ucraino e non credo stia passando dei bei momenti





Ho scritto qui ma forse queste discussioni sarebbe meglio farle in privato per non tediare gli altri




Ci leggiamo




--
Bruno L.


Pagina: 1



Esegui il login per scrivere una risposta.