Go Down

Topic: "Negare" / "Capovolgere" linea seriale a livello Software (Read 1 time) previous topic - next topic

LucianoArdu

Salve a tutti.
Mi trovo difronte alla necessità di dover capovolgere le linee TX ed RX della comunicazione seriale sul mio prototipo sviluppato su Arduino mega.
In pratica in alcune condizioni di comunicazione con un dispositivo piuttosto che un altro sono costretto a capovolgere le 2 linee facendo uso di un transistor NPN su ognuna di essa.

Esiste un modo per farlo a livello software?
Cioè vorrei poter avere questa possibilità senza far uso di componenti esterni aggiuntivi.
Una funzione, un comando che mi permetta capovolgere completamente le 2 linee (non il semplice dato trasmesso).

ORSO2001

ciao...sinceramente non ho capito cosa ti serve...vuoi che, ad un certo punto, TX diventi RX ed RX diventi TX?
se è questo quello che ti serve...la causa è una non "facile" dislocazione dei componenti hardware?

altrimenti, almeno per me, cerca di chiarire cosa ti serve.
ciao

Standardoil

Credo che semplicemente voglia passare il funzionamento della seriale da attivo basso, modo normale, a attivo alto, negando (invertendo) sia tx che rx. Sulle seriali software si può da codice, su quelle hw non saprei
Prima legge di Nelson (che sono io): Se vuoi il mio aiuto dimostrami almeno che hai letto il nostro "aiutateCi ad aiutarVi"

Non bado a studenti, che copino altrove

Tu hai problema-Io ti domando-Tu non mi rispondi: vuol dire che non ti serve più

LucianoArdu

ciao, no scusami, forse come dici non mi sono espresso bene.
In pratica cerco una funzione software per poter capovolgere il segnale trasmesso e ricevuto sulla seriale.
In pratica a livello hardware corrisponde all' uso di una NOT sulla linea di ingresso e una NOT sulla linea di uscita.
in pratica se il protocollo NRZ prevede 1 bit di start (1 logico), 8 bit di dato e 1 di stop (0 logico) ed io normalmente invio il dato decimale 85 (01010101 in binario) avrò il treno di dati di 10 bit così composto: 1010101010
io vorrei a mio picimento poter capovolgere l' intera trasmissione....in modo tale da avere in uscita 0101010101...
Spero di essermi spiegato bene, non voglio capovolgere il solo dato (sarebbe facile) ma voglio capovolgere l' intera linea...

Standardoil

Tu non vuoi invertire la sequenza dei bit, vero? Ma solo il livello logico di ogni singolo bit? Perché l'esempio che hai fatto è valido per tutti e due i casi
Prima legge di Nelson (che sono io): Se vuoi il mio aiuto dimostrami almeno che hai letto il nostro "aiutateCi ad aiutarVi"

Non bado a studenti, che copino altrove

Tu hai problema-Io ti domando-Tu non mi rispondi: vuol dire che non ti serve più

ORSO2001

se vuoi invertire il valore dei bit da 0 ad 1 e da 1 a 0...non sarebbe sufficiente fare uno XOR (^0xFF) del dato ricevuto o da inviare?

EDIT: intendo per singolo byte

LucianoArdu

scusate ma il sistema non mi fa rispondere entro 5 minuti dalla mia precedente risposta :(
No io non voglio invertire il dato trasmesso, che si farebbe semplicemente con la XOR ma voglio capovolgere tutto il sistema di trasmissione, compreso il bit di Start e il bit di Stop. Tutta la linea in pratica.
Con la XOR capovolgo solo il dato che trasmetto ma la logica di funzionamento non la capovolgo.
Con l' esempio che fatto prima se io usassi la XOR e trasmettessi il treno 1010101010 in uscita avrei 1101010100, dove il 1° bit (START) e il decimo (STOP) resterebbero invariati....
In pratica, per semplificare, se io normalmente trasmetto 0x00 avrei in uscita 1000000000
Se usassi la XOR del dato avrei in uscita 1111111110 (che sarebbe come trasmettere un 0xFF)
Invece io vorrei avere in uscita 0111111111

brunello22

Te l'hanno già detto, la seriale hardware non permette di invertire il livello del segnale
quindi o continui a usare due bjt o usi la software serial

Code: [Select]
  SoftwareSerial(uint8_t receivePin, uint8_t transmitPin, bool inverse_logic = false);


LucianoArdu

No non me lo avevano già detto, mi è stato confermato che la SoftwareSerial lo permette, ma non che quella Hardware non lo permette.
Ok ti ringrazio per la precisazione, quindi con quella Hardware non è possibile farlo.
Tra le 2 alternative (Hardware o Software) credo che sceglierà la via software per avere una maggiore versatilità dello stesso dispositivo senza cambiamenti hardware esterni.
Grazie mille per la celerità.

uwefed

Ma sei sicuro di non voler mescolare la seriale con livelli TTL con una RS232?

Non é possibile; rompi la seriale.

Ciao Uwe

LucianoArdu

Ciao Uwe, no assolutamente, voglio semplicemente fare quello che ho descritto.
Questo perché il mio dispositivo deve poter comunicare con altri dispositivi dove in alcuni casi hanno la logica di TX e RX invertita, in ingresso e in uscita hanno un NPN che capovolge la situazione.
Attualmente comunico con queste 2 tipologie di dispositivi semplicemente interponendo un piccolo circuito con 2 NPN che mi capovolgono la linea seriale, ovviamente solo sul dispositivo interessato.
Tutto funziona perfettamente....
Però volevo sostituire questa funzione attualmente Hardware con una equivalente funzione software.

Silente

Il problema é che via seriale vengono trasmessi piú bit di quelli richiesti dalla Serial.print (o meglio dalla sua primitiva Serial.write). Per esempio il controllo di parità, lo stop, lo start. E questi bit la UART li ottiene facendo un confronto hardwere, quindi non modificabile. Di conseguenza nelle seriali predisposte, in cui é richiamata la UART non si può invertire i segnali via software. Se invece si utilizza una seriale software la UART non viene mai richiamata, e tutto il lavoro é fatto dal programma. Di conseguenza é certamente possibile (anche se non so come, ma credo basti vedere le specifiche della SoftwareSerial) creare una seriale invertita senza uso di hardwere
Dove va un numero va una variabile, una funzione e/o  un test.
Per ottenere devi spiegare

Strumenti/Formattazione automatica fino alla morte!
Cristianesimo:bibbia='C':K&R

gpb01

... Di conseguenza é certamente possibile (anche se non so come, ma credo basti vedere le specifiche della SoftwareSerial) creare una seriale invertita senza uso di hardwere
Si, se ne è già parlato alcuni post sopra, la SoftwareSerial ha un apposito parametro perdisposto a fare esattamente quanto l'OP richiede.

Guglielmo
Search is Your friend ... or I am Your enemy !

LucianoArdu

Si infatti, il discorso è chiarissimo.
Speravo si potesse fare su quella Hardware in quanto tutto il sistema è ormai pronto e definito.

Una eventuale possibilità sarebbe di utilizzare la SoftwareSerial sugli stessi I/O utilizzati dalla UART Hardware, è possibile fare ciò?
Eventualmente lavorerei solo a livello software e lascerei tutto il resto come si trova ora.

gpb01

Teoricamente, su Arduno UNO, si. Su altre schede occorre sempre fare riferimento al reference della SoftwareSerial perché SOLO alcuni pin possono essere utilizzati per il RX.

Dato che tu stai usando la MEGA ... la risposta è quindi NO.

Guglielmo
Search is Your friend ... or I am Your enemy !

Go Up