Pagina 1 di 2

Lettura dalla porta seriale, carattere di terminazione

MessaggioInviato: 12 mag 2021, 12:28
da lemure64
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/

Re: Lettura dalla porta seriale, carattere di terminazione

MessaggioInviato: 12 mag 2021, 12:53
da stefanopc
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

Re: Lettura dalla porta seriale, carattere di terminazione

MessaggioInviato: 12 mag 2021, 13:01
da lemure64
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 :(

Re: Lettura dalla porta seriale, carattere di terminazione

MessaggioInviato: 12 mag 2021, 13:10
da stefanopc
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

Re: Lettura dalla porta seriale, carattere di terminazione

MessaggioInviato: 12 mag 2021, 14:12
da WALTERmwp
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

Re: Lettura dalla porta seriale, carattere di terminazione

MessaggioInviato: 12 mag 2021, 14:13
da lemure64
E' lei, la perfida funzione :D

Re: Lettura dalla porta seriale, carattere di terminazione

MessaggioInviato: 12 mag 2021, 14:14
da nicsergio
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

Re: Lettura dalla porta seriale, carattere di terminazione

MessaggioInviato: 12 mag 2021, 14:15
da WALTERmwp
Dove è descritta ?

Saluti

Re: Lettura dalla porta seriale, carattere di terminazione

MessaggioInviato: 12 mag 2021, 14:27
da nicsergio
WALTERmwp ha scritto:Dove è descritta ?


https://github.com/imabot2/serialib

Re: Lettura dalla porta seriale, carattere di terminazione

MessaggioInviato: 12 mag 2021, 14:32
da lemure64
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