Cos'è ElectroYou | Login Iscriviti

ElectroYou - la comunità dei professionisti del mondo elettrico

Lettura dalla porta seriale, carattere di terminazione

Linguaggi e sistemi

Moderatori: Foto UtenteMassimoB, Foto UtentePaolino, Foto Utentefairyvilje

0
voti

[11] Re: Lettura dalla porta seriale, carattere di terminazione

Messaggioda Foto UtenteMarcoD » 12 mag 2021, 14:46

Hai il problema della trasparenza, ossia di realizzare un protocollo in cui si distinguono i dati dai comandi, senza aggiungere troppi byte in più.

Nel link c'è la descrizione di un programma arduino in cui numeri binari inferiori a 100 sono convertiti in ASCII e poi trasmessi.

https://www.electroyou.it/marcod/wiki/a ... emperature

Forse posso rintraccaire il programma di ricezione, scritto nell'ambiente processing

O_/
Avatar utente
Foto UtenteMarcoD
8.829 4 9 13
Master EY
Master EY
 
Messaggi: 4118
Iscritto il: 9 lug 2015, 16:58
Località: Torino

2
voti

[12] Re: Lettura dalla porta seriale, carattere di terminazione

Messaggioda Foto UtenteGioCosco » 12 mag 2021, 15:09

scrivo di corsa, scusami...
primo carattere sempre uguale, ad esempio "$", aspetta fino a che non ricevi questo carattere poi passa al secondo
secondo carattere = lunghezza
dal terzo in poi fino alla lunghezza quello che vuoi, usa available( ) per sapere se c'è qualcosa da leggere poi readChar() e writeChar(), le funzioni di stringa quasi sicuramente "filtrano" qualcosa a livello ascii
dopo la lunghezza "deve" arrivare il carattere di terminazione, ad esempio "@" e poi il crc (opzionale...)
se qualche condizione non c'è allora torna al punto 1
accumula tutto in un buffer, quando sono arrivati tutti i caratteri verifica che il primo sia "$" oppure STX se vuoi mantenere lo standard ASCII, verifica che nella posizione esatta ci sia il terminatore oppure ETX, poi verifica il crc se lo hai mandato
Avatar utente
Foto UtenteGioCosco
50 1
 
Messaggi: 17
Iscritto il: 14 giu 2019, 14:28

0
voti

[13] Re: Lettura dalla porta seriale, carattere di terminazione

Messaggioda Foto Utentelemure64 » 12 mag 2021, 16:07

Grazie anche a te, ho già implementato qualcosa di simile, perché i dati da trasmettere sono tanti e li trasmetto a pacchetti, con caratteri di inizio, controllo, terminazione e così via. Il problema è molto limitato, non è il protocollo, ma il fatto che inevitabilmente (nel frattempo ho riflettuto su come funzionano le funzioni di conversione e i bytes possono assumere qualsiasi valore) le funzioni che ho a disposizione su windows per ricevere vogliono un carattere di chiusura, quindi non se ne esce.

Ho provato tutte le librerie che ho trovato ma o vengono sviluppate sotto Linux e non sono controllate in windows (dato che di nessuna ha funzionato CMake) oppure vogliono visual studio, insomma, come uccidere una mosca con la ruspa, e non ho visual studio. Quella che ho citato è la sola libreria che mi riesca usare :/
Avatar utente
Foto Utentelemure64
675 3 6
Stabilizzato
Stabilizzato
 
Messaggi: 381
Iscritto il: 23 giu 2020, 12:26

0
voti

[14] Re: Lettura dalla porta seriale, carattere di terminazione

Messaggioda Foto Utentestefanopc » 12 mag 2021, 18:02

Potresti aggirare il problema.
Potresti fare così nella tua codifica in Tx, ad alto livello, vai a correggere i byte dove è presente il carattere di stop per esempio lo metti 0.
Ovviamente lo stop reale quello di fine messaggio lo lasci stare.

Tieni nota delle posizioni e le trasmetti al terminale opposto in Rx che ad alto livello, sapendo dove fare le correzioni ricompone tutto come in origine.
Non so se ne vale la pena ma si può fare.
Spero di essermi spiegato.
Sai cosa è il fec.
"fec error correction" un qualcosa di vagamente simile.

Ciao
600 Elettra
Avatar utente
Foto Utentestefanopc
4.248 2 5 12
Master
Master
 
Messaggi: 1337
Iscritto il: 4 ago 2020, 9:11

1
voti

[15] Re: Lettura dalla porta seriale, carattere di terminazione

Messaggioda Foto Utentedjnz » 12 mag 2021, 18:15

lemure64 ha scritto:inevitabilmente le funzioni che ho a disposizione su windows per ricevere vogliono un carattere di chiusura, quindi non se ne esce

Il problema mi sembra nasca dal voler usare per forza readString, che come dice il nome immagino serva per ricevere sequenze di caratteri ASCII + terminatore, e non sequenze di byte qualsiasi.

Una generica readChar o readBytes invece accetta per definizione qualsiasi byte, e cosa farne è compito del programma.

Quindi o trasmetti solo ASCII (ad esempio valori binari convertiti in esadecimale, due caratteri per ogni byte), o ricevi a livello più basso a singoli byte (con readChar), e ci puoi fare quello che vuoi.

Invece se vuoi usare la readString, e ammesso che il problema sia solo il terminatore, ma non è detto, allora basterebbe "mascherarlo", trasformandolo in trasmissione in qualcos'altro, ma siccome ogni combinazione di bit è buona non gli si può assegnare semplicemente un altro valore, ci tocca "aggiungere informazione" ad esempio tramite sequenze di escape. Così quando devi trasmettere un terminatore dentro i dati potresti invece trasmettere la coppia \@, e quando devi trasmettere il valore binario corrispondente al backslash trasmetti due backslash di fila \\. In ricezione analizzi i backslash, scartando il primo che arriva e in base a quello che ricevi immediatamente dopo (@ oppure \) sai se li ci va il valore del terminatore o il vero backslash.
Avatar utente
Foto Utentedjnz
350 1 5
Frequentatore
Frequentatore
 
Messaggi: 145
Iscritto il: 26 lug 2020, 14:52

0
voti

[16] Re: Lettura dalla porta seriale, carattere di terminazione

Messaggioda Foto Utentelemure64 » 12 mag 2021, 18:31

Grazie a tutti, ora mi è tutto più chiaro, il concetto di carattere di terminazione è "insano" per il contesto e mi è stato chiaro improvvisamente :D

Nel frattempo ho trovato una libreria che fa proprio quello che (purtroppo) è necessario ovvero appena c'è qualcosa sulla porta ritorna il numero di caratteri che ha messo nel buffer. Ora devo ricomporre la stringa e poi passarla alle funzioni di parsing, spero che funzionerà.

Grazie, grande forum come sempre :)
Avatar utente
Foto Utentelemure64
675 3 6
Stabilizzato
Stabilizzato
 
Messaggi: 381
Iscritto il: 23 giu 2020, 12:26

Precedente

Torna a PC e informatica

Chi c’è in linea

Visitano il forum: Nessuno e 10 ospiti