Buongiorno a tutti. Mi trovo a dover comunicare con un vecchi apparato che supporta la comunicazione seriale 1200 7 bit pari. Con un Arduino nano riesco a comunicare con la seriale hardware, ma sacrifico il serial monitor, sembra che la libreria software serial non permetta queste impostazioni. Esiste un’altra libreria? Un’ atra soluzione sarebbe quella di usare un Mega, ma per i pochi byte che devo inviare mi sembra sprecato..grazie a tutti
Non so, puoi provare a guardare QUESTA che è decisamente superiore alla SoftwareSerial ![]()
Guglielmo
Temo di no
Ne la softserial ne la altsoftserial lo permettono
Però so per certo che la modifica della softserial non è difficile per portarla a 7 bit
Per parità pari non so... ma non dovrebbe
C’è anche la NeoSWSerial, ma anche questa non supporta la configurazione della seriale come hai bisogno.
Modificare queste librerie è una possibilità, ma per quello che costano le dev-board più moderne (non esiste solo la Arduino Mega, ci sono decine di alternative), ne vale davvero la pena in termini di impegno e tempo necessario?
Ma forse nemmeno serve fare nulla del genere
7E1 equivale a 8N1 (il due era un refuso) con l'ottavo bit strippato via (Ecco il 7)
E sostituito col bit di parità
(Ecco la E)
In buona sostanza basta pre-trattare il char da trasmettere
Grazie per le indicazioni. Purtroppo sembra non andare. Avevo pensato a pretrattare ma oltre che trasmettere non avevo detto che devo anche ricevere.. mi piacerebbe usare una scheda diversa, ma mi servono 5V e non logica 3,3. Pensavo l’ R4 ma non mi è molto simpatico, a costo di essere impopolare su ArduinoForum
Grazie ancora
Simpatie o antipatia a parte, comunque, SE ricordo bene, i 1200 bps, su R4, hanno dei problemi, perché vengono utilizzati dal bootloader per riconoscere alcune funzioni ... ![]()
Guglielmo
... o a 8N1 gestendo "a manina" la parità (sia in RX che in TX)? ![]()
Guglielmo
Mi viene in mente che la fortuna è cieca, ma la sfiga ci vede benissimo..
L'argomento mi intriga, nonostante siano decenni che non ho a che fare con device che funzionano solo a 1200 7E1... ![]()
Quindi mi è venuta una curiosità ma non avendo modo di verificare con qualche vecchio device in 7E1 volevo capire.
Diciamo che chi trasmette lo fa in 7E1 e chi riceve (Arduino) lo fa in 8N1, Se ad esempio chi trasmette dovesse mandare il byte 0x45 ossia 'E', a questo aggiungerebbe il bit di parità ad 1 ossia se non erro manderà i bit:
0 1010001 1 1
(in sequenza come start, 7 bit di dati da LSB a MSB, poi uno di parità e bit di stop)
Questo significa che se li ricevessi come 8N1 con la SoftwareSerial, il byte letto dall'istruzione "byte b = mySerial.read();" sarebbe "11000101", ossia 0xC5 esatto?
A quel punto non mi basterebbe ignorare (o estrarre e verificare) il bit di parità con "b = b & 0x7F;" e usare quindi "b"? Mi sfugge qualcosa?
... era quello che suggerivo al post #8 ![]()
Guglielmo
Si, infatti, ma non capivo l'affermazione "7E1 equivale a 8N2", che non mi torna...
Avevo errato a scrivere
Era 8N1
Ah, ok, immaginavo, era troppo strano infatti. ![]()
Comunque vista la premessa, per l'OP a me non pare sia particolarmente difficile implementare una "void send7e1(byte b)" (che calcola la parità e l'aggiunge come bit più alto) e una "byte read7e1()" (che estrae il bito di parità, eventualmente lo verifica, e restituisce il valore letto).
Da parte mia ringrazio tutti per i suggerimenti. Non credo di avventurarmi in conversioni, cercavo qualcosa di nativo, quindi credo userò un mega. Non vedo altre schede multiseriale con logica a +5 ma non vorrei cambiare argomento rispetto alla discussione
Non capisco perché nel mondo Arduino ci si ostini ancora con schede a 5V quando tutto il mondo dei microcontrollori e dell’elettronica digitale usa 3.3V ed anche tensioni più basse (fino a 1.0V secondo lo standard LVTTL).
I vantaggi nell’usare livelli di tensione più bassi sono tanti: riduzione del consumo elettrico, frequenze di lavoro più elevate, minore rumore elettromagnetico e una maggiore affidabilità degli integrati per via del minore stress elettrico.
Limiti la scelta delle opzioni disponibili a 2/3 famiglie di microcontrollori senza una reale ragione obiettiva. Se il tuo dispositivo seriale funziona a 5V, tipicamente è sufficiente una resistenza in serie tra il pin TX 5V ed il pin RX 3.3V, oppure facendo le cose a prova di bomba un piccolo MOSFET connesso come level shifter.
Posso capire le perplessità ma ci sono diverse motivazioni. Si parla di progetti fatti per hobby, utilizzo una scheda nano con un breakout che fornisce già pin RX TX e GND. Mettere 3 resistenze significa poggiarle da qualche parte, saldarle, collegamenti meno puliti.. Inoltre se devo collegare un display o una periferica I2C vale lo stesso con la differenza di un adattatore di livello in più... Con i +5 mi bastano 2 strip dupont e via.. Ho costruito dei circuiti con stampato dedicato ed ho usato il solo esp32 solo cpu a saldare, ma qui è diverso. Considera che poi Arduino viene spesso usato per la didattica, dove anche il valore di 3 resistenze può essere fonte di errore, un problema in più, una dimenticanza e un rischio di guastare scheda..
Come ti suggerivo, fare due funzioni per convertire dinamicamente i dati per adattarli al 7E1 non è complicatissimo e secondo me ne vale la pena sia per evitarti di usare un bazooka (il Mega) per uccidere una mosca, sia perché magari in questo modo impari anche qualcosa in più che può esserti utile anche in futuro.
Avrei potuto scrivertele io (anche se qualche spunto l'ho te scritto nei post #10 e #14) ma a parte l'impossibilità per me di provarle visto che non ho alcun device seriale che funzioni con la parità, per evitare la cosiddetta "pappa pronta" preferirei che ci provassi tu, postando qui il tuo codice (specie se non ti funziona, così proviamo a darti una mano).
Forza, provaci!
PS: se vuoi gestire la parità devi anche saper calcolare il bit di parità ma dato che forse è un poco "ostico" gestire i bit, ti do' qualcosa su cui iniziare a lavorare.
Prova questa funzione, che ho scritto "al volo" (quindi da verificare), nella quale per controllare se il bit i-esimo è a 1 utilizzo lo shift (>>) per portare in prima posizione (bit meno significavito, LSB) il bit che voglio verificare e con l'operatore bitwise AND (&) lo "maschero" ossia estraggo il solo bit che mi interessa e vedo se è diverso da 0:
int calcolaParita(byte b) {
int count = 0;
for (int i = 0; i < 8; i++) {
if ((b >> i) & 1) {
count++;
}
}
return ((count % 2) << 7);
}
La funzione restituisce la parità come bit più significativo (MSB) ossia 0x80 se dispari, 0x00 se pari. Questo valore lo dovresti quindi confrontare con il bit di parità che ricevi (sempre estraendo il solo MSB), oppure aggiungere al dato che stai inviando.
Non so quale sia la tua esperienza con oeprazioni "bitwise" ma ti assicuro che sono concetti molto utili nei microcontrollori. Pensi di provarci?
Ti ringrazio dei suggerimenti e della motivazione, ma ormai penso di essere troppo vecchio per farmi problemi di questo genere. Credo che l’ approccio che farei potrebbe essere la modifica della libreria, ma da qualche tempo adotto il “risparmio energetico”, troppe volte mi sono trovato a reinventare la ruota quando a monte bastava cambiare opzione.