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

[1] Lettura dalla porta seriale, carattere di terminazione

Messaggioda Foto Utentelemure64 » 12 mag 2021, 12:28

Ciao Forum

Ho una domanda stupida ma premetto che sono una rapa su tante cose e questa è una di quelle. Sto usando una libreria il cui link è in calce, ed è con quella che ho il problema.

Lo scopo è quello di acquisire una serie di valori numerici convertiti in binario, tramite apposito banale protocollo che ho scritto, e poi riconvertili in decimale per la stampa.

La funzione che mi dà problemi è proprio quella cardine, la lettura di un buffer; tra i suoi argomenti vuole il carattere di terminazione e uso quello dell'esempio che è il classico '\n'.

Il problema è che quando uno dei bytes ha il valore 10 probabilmente lo interpreta in qualche modo come fine buffer o peggio è seguito da 13 e prende la squenza anche stavolta come fine buffer. I miei tentativi di stampare l'array per vedere cosa succede sono frustrati dal fatto che per quanto io cerchi di stampare tutta la lunghezza del buffer allocato da me, è la funzione che a un certo punto non legge più caratteri o comunque non me li presenta e oltre un certo indice vedo solo gli zeri dell'inizializzazione. Il classico serpente che si morde la coda versione informatica :D

Ora non so come uscire da questo problema. Non penso sia possibile stabilire restrizioni di qualche genere: un numero una volta convertito potrebbe contenere la sequenza 10,13 o a quanto pare anche solo 10, e la lettura si fermerebbe. Potrei usare un carattere di terminazione diverso da passare alla funzione ma quello che non so è se esiste la dimostrazione che i bytes di un numero intero convertito hanno valore compreso in un certo range; se fosse così sarebbe facile perché mi basterebbe usare un carattere che non sia compreso, ma non credo sia questa la soluzione anche perché potrebbe dipendere dalla rappresentazione in binario nella macchina. Non solo, ma usare un carattere di terminazione non tipico come '\n' o '\0' o loro combinazione, mi pare un azzardo.

Se masticassi di quel livello inferiore (ma concettualmente tutt'altro che inferiore) tra l'hardware e il software potrei studiarmi quella libreria ma non riesco a capire minimamente come funzioni. Non so come uscire da questa piccola trappola che peraltro credo sia abbastanza comune, ma che non trovo in rete come affrontare. Qualcuno potrebbe darmi una mano? Grazie mille :)

https://lucidar.me/en/serialib/cross-plateform-rs232-serial-library/
Avatar utente
Foto Utentelemure64
680 3 6
Stabilizzato
Stabilizzato
 
Messaggi: 388
Iscritto il: 23 giu 2020, 12:26

1
voti

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

Messaggioda Foto Utentestefanopc » 12 mag 2021, 12:53

Risposta forse stupida.
È obbligatorio usare un terminatore?
Se si utilizza una sequenza più lunga di 8byte almeno.
Se no fai ritrasmissione con uno schema asincrono tipo per esempio
-8 byte inizio
- n byte dati
- 8 byte fine
- 8byte crc.
Ciao
600 Elettra
Avatar utente
Foto Utentestefanopc
6.695 3 8 12
Master EY
Master EY
 
Messaggi: 2320
Iscritto il: 4 ago 2020, 9:11

0
voti

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

Messaggioda Foto Utentelemure64 » 12 mag 2021, 13:01

Non so se è la stessa cosa ma ho lasciato due bytes dopo una tripletta di caratteri a inizio stgringa (come marcatore), nei quali scrivo la lunghezza della sequenza prima di trasmetterla. Quando quei due bytes non valgono né 10 né 13 leggo correttamente il valore. Il problema è che quella funzione si ferma quando incontra il carattere di terminazione. La scrittura della lunghezza buffer era nata solo come un ulteriore check ma se riuscissi a leggere un numero da me impostato di caratteri (ovviamente di meno se non ce ne sono nel buffer) avrei risolto perché potrei utilizzarla. Ma non ci riesco :(
Avatar utente
Foto Utentelemure64
680 3 6
Stabilizzato
Stabilizzato
 
Messaggi: 388
Iscritto il: 23 giu 2020, 12:26

1
voti

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

Messaggioda Foto Utentestefanopc » 12 mag 2021, 13:10

Aggiungi 50 o altro numero al dato che ti da problemi prima di trasmettere e poi lo sottrai quando lo hai ricevuto.

Non è una grande idea ma probabilmente funziona.
In alcuni sistemi di trasmissione usano scrambler in Tx e descrambler in Rx per evitare sequenze ripetitive e il problema che hai riscontrato.
Una buona cosa sarebbe cambiare libreria o modificarla a dovere.
Mi sembra un po' basica.
Ciao
600 Elettra
Avatar utente
Foto Utentestefanopc
6.695 3 8 12
Master EY
Master EY
 
Messaggi: 2320
Iscritto il: 4 ago 2020, 9:11

1
voti

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

Messaggioda Foto UtenteWALTERmwp » 12 mag 2021, 14:12

Ciao
lemure64 ha scritto:(...) e uso quello dell'esempio che è il classico '\n'. (...)

Non ho letto documentazione e non sono andato oltre la pagina che direttamente proponi, quale esempio ?
La funzione in causa è readString() ?

Saluti
W - U.H.F.
Avatar utente
Foto UtenteWALTERmwp
26,5k 4 8 13
G.Master EY
G.Master EY
 
Messaggi: 7934
Iscritto il: 17 lug 2010, 18:42
Località: le 4 del mattino

0
voti

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

Messaggioda Foto Utentelemure64 » 12 mag 2021, 14:13

E' lei, la perfida funzione :D
Avatar utente
Foto Utentelemure64
680 3 6
Stabilizzato
Stabilizzato
 
Messaggi: 388
Iscritto il: 23 giu 2020, 12:26

1
voti

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

Messaggioda Foto Utentenicsergio » 12 mag 2021, 14:14

Stai usando la funzione readString()?
In questo caso potresti trasmettere una stringa contenente i numeri convertiti in caratteri, ad esempio con la funzione itoa() o sprintf() o equivalente ed usare proprio \n o \0 come terminatore.
In alternativa, a readString() potresti passare qualcos'altro al parametro finalChar, in questo modo non viene proprio gestito il terminatore e si utilizza il massimo numero di byte da leggere che gli hai passato per uscire dall'iterazione quindi dovresti trasmettere sempre lo stesso numero di byte.
Se non ho capito male la readBytes() fa proprio questo.

...oops: vedo ora che qualcuno te lo ha già chiesto
Ultima modifica di Foto Utentenicsergio il 12 mag 2021, 14:21, modificato 3 volte in totale.
♫♪♫ ƎlectroYou ♫♪♫
⊲∎⊳ ━❍────── ∞
VOLUME : ▁▂▃▅▆▇ 100%
Avatar utente
Foto Utentenicsergio
3.782 1 9 13
Master
Master
 
Messaggi: 632
Iscritto il: 1 gen 2020, 16:42

0
voti

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

Messaggioda Foto UtenteWALTERmwp » 12 mag 2021, 14:15

Dove è descritta ?

Saluti
W - U.H.F.
Avatar utente
Foto UtenteWALTERmwp
26,5k 4 8 13
G.Master EY
G.Master EY
 
Messaggi: 7934
Iscritto il: 17 lug 2010, 18:42
Località: le 4 del mattino

0
voti

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

Messaggioda Foto Utentenicsergio » 12 mag 2021, 14:27

WALTERmwp ha scritto:Dove è descritta ?


https://github.com/imabot2/serialib
♫♪♫ ƎlectroYou ♫♪♫
⊲∎⊳ ━❍────── ∞
VOLUME : ▁▂▃▅▆▇ 100%
Avatar utente
Foto Utentenicsergio
3.782 1 9 13
Master
Master
 
Messaggi: 632
Iscritto il: 1 gen 2020, 16:42

0
voti

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

Messaggioda Foto Utentelemure64 » 12 mag 2021, 14:32

Foto Utentenicsergio, sono su micro (oddio, Arduino, micro è una parola grossa ma spero di star facendo qualcosa di portabile) e sto scrivendo tutto il possibile inline e soprattutto convertendo direttamente senza usare funzioni di stampa, che in un contesto del genere vedo fuori questione. La conversione la fanno delle funzioni che ho spudoratamente trovato in rete e che non ho la minima idea di cosa stiano facendo se non shiftare bits e ho appunto visto che il risultato di questo può essere (o almeno mi sembra poter essere) qualsiasi carattere-valore. Mi basterebbe poter essere sicuro che ne esiste almeno uno che non può uscire fuori dalla loro esecuzione e sarei a cavallo, lo userei come terminatore.

Foto UtenteWALTERmwp penso sia del tutto autodocumentante, è un loop che usa la lettura del singolo carattere con l'api di win. Potrei facilmente modificarla ma in vita mia ho messo una volta le mani su una libreria e molto mal me ne è incòlto, non lo vorrei fare :D
Avatar utente
Foto Utentelemure64
680 3 6
Stabilizzato
Stabilizzato
 
Messaggi: 388
Iscritto il: 23 giu 2020, 12:26

Prossimo

Torna a PC e informatica

Chi c’è in linea

Visitano il forum: Nessuno e 8 ospiti