"Negare" / "Capovolgere" linea seriale a livello Software

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).

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

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

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...

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

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

scusate ma il sistema non mi fa rispondere entro 5 minuti dalla mia precedente risposta :frowning:
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

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

  SoftwareSerial(uint8_t receivePin, uint8_t transmitPin, bool inverse_logic = false);

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à.

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

Non é possibile; rompi la seriale.

Ciao Uwe

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.

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

Silente:
... 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

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.

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

ok, come non detto. Grazie mille Guglielmo per le sempre celeri e utili risposte.

EDIT:
Leggendo le specifiche della SoftwareSerial ho capito che la limitazione è che il pin dedicato all' RX deve necessariamente supportare il Change Interrupts.
Visto che io sul Mega utilizzo la Seriale3 ho visto che proprio i pin utilizzati dalla UART3 (63 e 64) supportano il Change Interrupts, mentre le altre UART no.
A questo punto tecnicamente sarebbe fattibile? giusto?
Inoltre, per altro progetto simile, se usassi la UART1 un MCU tipo il 1284P lo stesso potrei sfruttare questa funzione, potrei utilizzare la seriale Hardware o quella Software a mio piacimento.
Tutto corretto? o sbaglio qualcosa?
Grazie ancora.

LucianoArdu:
Speravo si potesse fare su quella Hardware in quanto tutto il sistema è ormai pronto e definito.

Boh io lo farei via hardware controllato da software, ossia metterei due belle porte XOR (tipo un 7486), una per TX e una per RX ed un pin per il controllo della logica. Ossia una cosa del tipo:

Per cui se il pin "Inv" lo metti a LOW hai la normale logica, con HIGH hai la logica invertita.

Puoi usare SOLO i pin ed le MCU che l'autore ha deciso di gestire nella SoftwareSerial (salvo che non ne fai una tua versione e gestisce altri pin che, comunque, devono poter essere collegati ad un change interrupt).

Ora, per la MEGA, l'autore parla dei pin: 10, 11, 12, 13, 14, 15, 50, 51, 52, 53, A8 (62), A9 (63), A10 (64), A11 (65), A12 (66), A13 (67), A14 (68), A15 (69) quindi ... puoi usare i due pin 63 e 64.

La SoftwareSerial dovrebbe supportare anche l'ATmega1284P ... non so però bene su quali pin ... ::slight_smile:

Guglielmo

docdoc:
Boh io lo farei via hardware controllato da software, ossia metterei due belle porte XOR (tipo un 7486), una per TX e una per RX ed un pin per il controllo della logica.

... soluzione senz'altro da preferire e sicuramente più affidabile della SoftwareSerial che, come si sale di velocità (oltre i 9600 bps) ... comincia a predere colpi ... :wink:

Guglielmo

docdoc:
Boh io lo farei via hardware controllato da software, ossia metterei due belle porte XOR (tipo un 7486), una per TX e una per RX ed un pin per il controllo della logica. Ossia una cosa del tipo:

Per cui se il pin "Inv" lo metti a LOW hai la normale logica, con HIGH hai la logica invertita.

Si certo, questa è una ottima soluzione, ma è comunque una modifica Hardware.
Come ho già specificato non posso modificare l' attuale Hardware (se non con sistemi esterni come già faccio con 2 NPN). Per eventuale nuovo progetto Hardware di certo questa è una delle migliori soluzioni utilizzando la seriale Hardware.

Grazie ancora :wink: