Ciao a tutti.
Non so se questo è il forum giusto. Io scrivo poi eventualmente i moderatori lo sposteranno. In caso mi scuso in anticipo.
Avrei bisogno di trasferire via seriale 6 caratteri(anche numerici non importa), si avete capito bene 6 caratteri e basta, quindi mi basterebbe poter inviare 4 bit invece degli 8 della seriale classica.
Praticamente dovrei fare questa decodifica:
a=0000
b=0001
c=0010
ecc...
Come posso fare? Devo modificare la SoftwareSerial?
Un carattere occupa sempre e comunque 8 bit, la seriale comunica inviando sempre 8 bit per volta, in realtà sono previste anche modalità a 7 e 6 bit però sono solo per retro compatibilità con vecchi sistemi ormai obsoleti.
Nel tuo caso devi comunque inviare sei byte, uno per ogni carattere, quindi non ha alcun senso il discorso che stai facendo, a partire dal fatto che fa confusione tra bit e Byte (8 bit).
erpomata:
Penso che per fare quello che vorrei fare bisognerebbe riscrivere un pò il protocollo di comunicazione seriale.
Si e non poco, comunque il limite è dato sempre dalla seriale software, anche se limiti i bit non cambia molto la cosa, i colli di bottiglia sono ben altri.
La seriale é definita per 8Bit. (una volta anche 7bit ma non si usa piú)
Quello che puoi fare é unire 2 numeri a 4Bit per avere 1 numero a 8 bit.
Ciao Uwe
erpomata:
No io voglio mandare un codice a 4 bit e basta.
Guarda che il consiglio di Uwe è ottimo, se a te bastano 4 bit, ci rappresenti 16 diversi simboli, per inviare l'informazione sfruttando tutti gli otto bit raddoppi a tutti gli effetti la velocità di trasmissione/ricezione perché spedisci due gruppi di dati per volta.
Non mi è chiaro.
Io devo spedire tramite seriale la lettura digitale di 3 pin ed attivare (o disattivare) 3 pin sul ricevente quindi 4 bit sono più che sufficienti.
Ma come fare?
erpomata:
Io devo spedire tramite seriale la lettura digitale di 3 pin ed attivare (o disattivare) 3 pin sul ricevente quindi 4 bit sono più che sufficienti.
Visto il tipo di applicazione mi chiedo perché ti stai creando tutti questi problemi di velocità, invia un byte contenente lo stato dei tre pin e sei a posto.
Nulla di più facile, ipotizziamo che i pin da inviare sono 4-5-6 non devi fare altro che assegnare a ciascuno un peso crescente pari a una potenza di due, ovvero il pin 4 vale 1, primo bit, il pin 5 vale 2, secondo bit, il pin 6 vale 4, terzo bit.
In pratica non devi fare altro che leggere lo stato dei pin, moltiplicarlo per 1, 2, 4 a seconda del pin e sommare questi valori tra loro, il valore ottenuto è il byte da inviare, in ricezione devi fare il procedimento opposto.
Un modo più semplice è usare una union però non so se le conosci e non vorrei confonderti le idee.
int pin4 = digitalRead(4) * 1;
int pin5 = digitalRead(5) * 2;
int pin6 = digitalRead(6) * 4;
int toSend = pin4 + pin5 + pin6;
oppure come dice leo:
byte toSend = 0;
if ( digitalRead(4) == HIGH )
bitSet(toSend, 0);
if ( digitalRead(5) == HIGH )
bitSet(toSend, 1);
if ( digitalRead(6) == HIGH )
bitSet(toSend, 2);
byte input=7; // input da seriale
int pin4 = input % 2;
int next = input / 2;
int pin5 = next % 2;
next = next /2;
int pin6 = next % 2;
digitalWrite(4, pin4):
digitalWrite(5, pin5):
digitalWrite(6, pin6):
o nella versione di leo:
byte input = 7; // input da seriale
digitalWrite(4, bitRead(input, 0)):
digitalWrite(5, bitRead(input, 1)):
digitalWrite(6, bitRead(input, 2)):