Comunicazione seriale TTL to RS232 usando CTS/RTS

Ciao a tutti.

Per lavoro volevo provare un convertitore RS232 <--> TCP (USR-TCP232-302) per collegare via cavo di rete un dispositivo seriale molto lontano dal server di lavoro e virtualizzando la COM sul server.
Il dispositivo funziona, usando i vari PC per fare simulazioni letture/scritture tutto okay.

Avevo pensato di provare/simulare un dispositivo che legge/invia su rs232 un Arduino Uno usando un convertitore TTL->RS232 con solo TX/RX ma il dispositivo USR-TCP232-302 non sente i dati seriali. Necessita dei segnali CTS/RTS.
Ho comprato un convertitore come questo:
image

Ora la domanda nasce sul software, come gestire i segnali RTS/CTS:
Quando voglio mandare i dati ho fatto (e funziona finalmente con il USR-TCP232-302) questo:

const byte CTS = 2;  // CLEAR TO SEND
const byte RTS = 3;  // REQUEST TO SEND

void setup() 
{ delay(2000);
  Serial.begin(9600);
  Serial.println("avvio");
  pinMode(CTS,INPUT);
  pinMode(RTS,OUTPUT);
  digitalWrite(RTS, LOW);  
  pinMode(LED_BUILTIN,OUTPUT);
  digitalWrite(LED_BUILTIN, LOW);  
}

void loop() 
{ 
  digitalWrite(RTS, HIGH);  
  delay(2);  
  digitalWrite(RTS, LOW);  
  while (digitalRead(CTS) == HIGH);  
  Serial.println("ciao");
  delay(5000);
  digitalWrite(LED_BUILTIN, !digitalRead(LED_BUILTIN) );  
}

Ma se nello stesso loop volessi anche verificare se ci sono dati in ricezione ?
Dovrei ascoltare se RTS == HIGH ? Però per spedire RTS lo uso in OUTPUT.

Ma ... veramente, quando tu vuoi trasmettere dovresti alzare il segnale di RTS (request to send) e, colui che deve ricevere, se è pronto, ti alza il CTS (clear to send).

In passato, quando non si voleva questa gestione, semplicemente si ponticellava il RTS con il CTS così, quanto uno voleva trasmettere e alzava il RTS, automaticamente si trovava alto il CTS e poteva trasmettere ... se tu vuoi gestire il Hardware Flow Control (perché di quello si tratta), lo devi gestire con pin in OUTPUT (per fare il RTS) e pin in INPUT (per ricevere il CTS), ma, dall'altra parte, ci deve essere un qualche cosa che gestisce anche essa il Hardware Flow Control ... :roll_eyes:

Guglielmo

1 Like

Grazie per la risposta.
Il pezzo che ho fatto funziona in scrittura. Metto il RTS in HIGH. Il dispositivo USR-TCP232-302 gestisce lui CTS e me lo mette HIGH. Provato e va.
Se ho capito bene, dovrei ascoltare CTS per sapere se leggere, e non RTS. Provo.

Si, potrei anche provare a ponticellare e vedere se anche così va.

C'è una complicazione in più. Una porta RS232 può essere 'host' o 'periferica'. In una porta 'host' DTR/RTS sono uscite, e DSR/CTS ingressi. In una porta 'periferica' il contrario. Quando si usavano solo connettori maschio per l'host (PC) e femmina per la periferica (modem), i problemi non si ponevano: connessioni dritte tra host e periferica, e connessioni incrociate tra host e host. Poi i "generi" dei connettori si sono mescolati... e non si sa più chi sia cosa.

In realtà DSR (data set ready) indica che il "data set" è pronto, DTR (data terminal ready) indica che il "terminal" è pronto ... quando sono tutti e due pronti, il DTE (data terminal equipment) alza RTS per indicare al DCE (data communication equipment) che vuole trasmettere e il DCE alza CTS per indicare che è pronto a ricevere ...

Schematicamente, quando esistevano i "terminali" (DTE) ed i "modem" (DCE), si aveva:

... c'è anche un segnale in più ... il DCD (data carrier detect) che indicava la presenza della portante sulla linea modem :wink:

Guglielmo

P.S.: dimenticavo ovviamente il SG (signal ground) ed il RI (ring indicator) che erano gli ultimi due segnali presenti nella presa RS232 standard :grin:

1 Like

... per inciso, all'epoca (anni 80) io andavo in giro per l'Italia ad analizzare terminali IBM 2780/3780 e IBM 3270 che davano alcuni problemini con ... un aggeggio come questo:

... un bel datascope che analizzava e registrava tutti i segnali della porta e tutti i dati che passavano permettendo di capire (forse) dove stava il problema :wink:

Guglielmo

1 Like

:grin: :grin: :grin: ... io ho ancora nel cassetto alcuni "gender changer" ... per quelle evenienze ...

Guglielmo

Anche io ho in qualche cassetto quei "cosi"!

1 Like

Anche io ne ho, grossi, piccoli e pure di tipo "null modem" ^-^

A volte dai miei clienti devo interfacciarmi ancora via RS232 con dei dispositivi del cavolo come delle semplice pese/bilance o delle macchine con vecchio protocollo ancora in RS232 (e non modbus)
Nel caso specifico è una bilancia/pesa che gli mandi $ e lei risponde con il peso letto sul display.

Con il USR-TCP232-302 (ma ci sono anche altre marche) passo da com virtuale a tcp e leggo a grande distanza senza mettere ripetitori rs232.

Ho dovuto fare la stessa cosa nei lontani anni '90 per la lettura da PC ...
... vedo che il protocollo non è cambiato di molto :grin:

Guglielmo

Zitto, che io a suo tempo (primi anni '90) ebbi persino a che fare con l'interfaccia di una telescrivente per una importante acciaieria del Nordest! Si, all'epoca gli ordini venivano ancora ufficialmente inviati via telex!
Non ricordo quale interfaccia fisica avesse la telescrivente, ma realizzammo un circuito adattatore per portare su RS232 tutto ciò che veniva ricevuto (credo a 75 o 110 baud!:turtle:), e da qui un PC acquisiva il testo, lo analizzava in base al mittente o a determinate parole nel testo associate alle sue regole, e lo trasformava in una email da inoltrare su POP3 all'indirizzo interno in base alla regola soddisfatta.
In fondo è stato comunque un lavoro interessante, visto che amo le sfide tecniche...:wink:

All'epoca le telescriventi avevano il collegamento 20 mA current loop :smiley: ... me le ricordo bene (le usavo negli anni '70) ... e si, si potevano fare adattatori 20 mA current loop <-> RS232 :wink:

Guglielmo

Ah si, esatto!
Però, accidenti, ogni tanto noto quanto so' vecchio... :sob: :sunglasses:

... tu eh ... :joy: :joy: :joy:

Guglielmo

Effettivamente ponticellando CTS con RTS il dispositivo va, senza fare cose strane nel codice

void setup()        // simulatore bilancia, ricevi $ invia $peso
{ delay(2000);
  Serial.begin(9600);
  Serial.println("avvio");
  pinMode(LED_BUILTIN,OUTPUT);
  digitalWrite(LED_BUILTIN,LOW);
}

void loop() 
{ if(Serial.available())
  { int c=Serial.read();
    if(c=='$')
    { digitalWrite(LED_BUILTIN, ! digitalRead(LED_BUILTIN) );
      Serial.println("$123.45");
    }
  }
}

Ovvio, te lo avevo detto, quando non serviva il Hardware Flow Control noi facevamo sempre così ... in questo modo appena viene alzato il segnale per chiedere il permesso di trasmettere, si riceve immediatamente il segnale che da il consenso a trasmettere :wink:

Guglielmo

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.