Lettura dati Seriale da un UPSsmart APC

Salve a tutti vista la mia passione per Arduino, mi sto cimentando in un progetto di controllo della mia sala server…

Mi spiego, ho un gruppo di continuita da 2500Va con porta seriale dal quale vorrei leggere le informazioni in caso mancasse la corrente ogni tanto lanciare dei comandi di auto-diagnostica.

Approfondendo l’argomento ho visto che dal mio UPS collegandoci una seriale al pc, collegando un cavo realizzato adhoc posso inviarci dei “char” e il gruppo mi risponde tranquillamente delle informazioni con altri caratteri.

ecco il link con tutte le info per interfacciarmi con l’UPS ed i comandi da inviargli
(http://networkupstools.org/protocols/apcsmart.html#_rs_232_differences)

*ORA il problema.
fino a che ho simulato dal pc … tutto ok , poi ho provato al posto del pc un Arduino DUE e una shiel RS232 per convertire il segnale in TTL (precisamente questa http://www.nulsom.com/datasheet/NS-RS232_en.pdf) ma non ricevo niente dall’UPS in teoria baserebbe inviargli il carattere “Y” e dovrei ricevere una risposta “SM” e poi posso inviare e ricevere quello che voglio ( per lo meno questo era quello che ho testato con la seriale del PC e funzionava)

Come test ho eseguito questo sketch ma non succede assolutamente niente:

void setup() {

 // initializzo la seriale integrata per utilizzarla da Monitor
 Serial.begin(2400);
 // initializzo la seriale2 di arduino2 PIN 17Rx, 18Tx per dialogare con L'ups
 Serial2.begin(2400);
 
 Serial.println("Setup....");
 delay(1000);
 // invio il carattere Y per iniziare a dialogare con l'ups
 Serial2.write('Y');
}

void loop() {
 
 
 if (Serial2.available()) {

   int inByte = Serial2.read();
   
   Serial.println("Ricevo da UPS:");
   Serial.print(Serial2.read());
 }

 // read from port 0, send to port 2:
 if (Serial.available()) {  
   int inByte = Serial.read();
   //invio all'ups il carattere che digito dalla tastiera del monito di arduino
   Serial2.write(inByte);
   Serial.print(inByte);
   
 }
}

ho provato con lo stesso cavo che ho utilizzato per il pc… con e senza, i pin (1-4) e (7-8) ponticellati lato arduino (per funzionare con il PC i ponticelli vanno fatti)

PIN Lato UPS <-> PIN Lato Arduino/Shield rs232

1 <-> 3
2 <-> 2
9 <-> 5

Dove sbaglio? perche non ricevo nulla?

Grazie in anticipo

if (Serial2.available()) {
    int inByte = Serial2.read();
    
    Serial.println("Ricevo da UPS:");
    Serial.print(Serial2.read());
  }

Leggi un carattere e lo metti in inByte. Poi di inByte non te ne fai assolutamente niente, ne leggi un altro e lo stampi.

Quindi perlomeno ti perdi un carattere ogni due che ricevi.

>giammarco: ti ricordo che in conformità al regolamento, punto 7, devi editare il tuo post qui sopra (quindi NON scrivendo un nuovo post, ma utilizzando il bottone More → Modify che si trova in basso a destra del tuo post) e racchiudere il codice all’interno dei tag CODE (… sono quelli che in edit inserisce il bottone con icona fatta così: </>, tutto a sinistra). Grazie.

Guglielmo

SukkoPera:

if (Serial2.available()) {

int inByte = Serial2.read();
   
    Serial.println("Ricevo da UPS:");
    Serial.print(Serial2.read());
  }





Leggi un carattere e lo metti in inByte. Poi di inByte non te ne fai assolutamente niente, ne leggi un altro e lo stampi.

Quindi perlomeno ti perdi un carattere ogni due che ricevi.

Sì scusami è un errore di battitura quando ho scritto sul forum... In realtà sul codice faccio il print di InByte...

>giammarco: ti chiedo, ancora una volta, nel rispetto del regolamento, di fare quanto ho richiesto nel post #2. Grazie.

Guglielmo

gpb01:
>giammarco: ti chiedo, ancora una volta, nel rispetto del regolamento, di fare quanto ho richiesto nel post #2. Grazie.

Guglielmo

Salve Guglielmo chiedo scusa se non ho potuto modificare il mio post prima di ora, visto che ero in giro e dallo smartphone la modifica non era agevole, fatta ora spero di non aver creato problemi .... saluti Giammarco

giammarco:
Sì scusami è un errore di battitura quando ho scritto sul forum... In realtà sul codice faccio il print di InByte...

Allora dacci il codice vero, non quello trascritto.
Ciao Uwe

uwefed:
Allora dacci il codice vero, non quello trascritto.
Ciao Uwe

Ciao Uwe e grazie per la risposta... Il codice che esegui corretto è questo:

void setup() {

// initializzo la seriale integrata per utilizzarla da Monitor
Serial.begin(2400);
// initializzo la seriale2 di arduino2 PIN 17Rx, 18Tx per dialogare con L'ups
Serial2.begin(2400);

Serial.println("Setup....");
delay(1000);
// invio il carattere Y per iniziare a dialogare con l'ups
Serial2.write('Y');
}

void loop() {


if (Serial2.available()) {

  int inByte = Serial2.read();
  
  Serial.println("Ricevo da UPS:");
  Serial.print(inByte);
}

// read from port 0, send to port 2:
if (Serial.available()) {  
  int inByte = Serial.read();
  //invio all'ups il carattere che digito dalla tastiera del monito di arduino
  Serial2.write(inByte);
  Serial.print(inByte);
  
}
}

Il problema non è il contenuto del print... Ma che la condizione serial2.available(). Non ricevo nessun dato da serial2... Ho provato a cambiare seriale e fa la stessa cosa... Mi viene forse in mente che la shield rs232 sia rovinata....

Devi verificare il pin out del adattatore RS232 lato 232, dal datasheet risulta che esiste in versione DTE e DCE, maschio o femmina, e cambia il pin out tra i due modelli, in particolare sono invertiti Tx e Rx tra loro perchè così è possibile usare un cavo non incrociato per collegare tra loro DTE e DCE.
Più semplicemente prova ad invertire Tx e Rx sul connettore che va sull'adattatore RS23-UART, domanda "stupida" però d'obbligo, ti sei ricordato di alimentare con 5V il convertitore ?

astrobeed:
Devi verificare il pin out del adattatore RS232 lato 232, dal datasheet risulta che esiste in versione DTE e DCE, maschio o femmina, e cambia il pin out tra i due modelli, in particolare sono invertiti Tx e Rx tra loro perchè così è possibile usare un cavo non incrociato per collegare tra loro DTE e DCE.
Più semplicemente prova ad invertire Tx e Rx sul connettore che va sull'adattatore RS23-UART, domanda "stupida" però d'obbligo, ti sei ricordato di alimentare con 5V il convertitore ?

Sì il convertitore è alimentato .... Ho provato sia a 3.3 che a 5 v visto che il datasheet lo permette... Proverò ad invertire lato Arduino il TX con RX ... Anche se credo di aver già fatto questa prova ma tra tutte quelle fatte potrebbe essermi sfuggito qualcosa... Altrimenti ordino un nuovo convertitore ... Vi tengo aggiornati... Grazie

Non il lato Arduino, dove il Tx del convertitore deve andare sul Rx di Arduino e viceversa, quello che devi provare ad invertire è il lato RS232, ovvero il connettore DB9 che va sul convertitore, scambia tra loro i pin 2 e 3.
Se stai usando la DUE devi alimentare il convertitore a 3.3V, se lo alimenti a 5V rischi di danneggiare i gpio.

Serial2.write('Y');

Sei sicuro che basti una write? Prova una println().

SukkoPera:

Serial2.write('Y');

Sei sicuro che basti una write? Prova una println().

Provato anche questo...

Oltre a DTE/DCE (quindi eventualmente invertire RX e TX) devi anche sapere se l'UPS richiede anche l'handshake hardware, in tal caso hai 3 possibilità: o lo attivi anche lato Arduino (non so l'adattatore RS232 che hai se lo gestisca) o lo disattivi lato UPS, oppure devi fare alcuni jumper sui relativi piedini della DB9 dell'UPS per fare un loopback dell'handshake (vado a memoria, dovrebbe essere DTR collegato a DSR e CD, e RTS su CTS, verifica comunque prima se è giusto cercando in rete null modem).

docdoc:
... dovrebbe essere DTR collegato a DSR e CD, e RTS su CTS ...

È esatto, del resto è anche ovvio se si ragiona sui segnali ... :wink:

"Data Terminal Ready" --+--> "Data Set Ready"
                        +--> "Carrier Detect"

"Request to Send"     -----> "Clear to Send"

Guglielmo

E' che sono anni che non smanetto più sulle RS232, ma ho scavato nella memoria di quando facevo queste cose :wink:

Dal manuale delle connessioni sul UPS, link nel primo post, risulta che non richiede l'handshake hardware, infatti lato ups sono collegati solo Tx, Rx e GND, mentre sul connettore lato pc sono evidenziati anche i ponticelli per l'handshake hardware, per Arduino non servono.

Si, possibile, hai ragione, non avevo letto il link, si vedono infatti solo i 2 segnali è GND.

Comunque non ci ha detto se dell'adattatore RS232 ha la versione M o F, e se ci fai caso la breakout ha RTS e CTS controllabili da appositi pin, non vorrei che sia il chip seriale onboard a non mandare nulla sulla seriale se lato Arduino non si alza uno dei due (a seconda se DTE o DCE).

Per assicurarsene, credo sia opportuno verificare nelle specifiche di quel modulino RS232 l'uso di quei pin di handshake per capire se siano solamente "passanti" (come credo), o se ci faccia qualcosa.

Se nessuno richiede handshake hardware allora essendo solo 3 pin il problema di cablaggio si riduce a quello che avete detto, ossia eventualmente inversione RX con TX (ma sul cavo, ovviamente, non su Arduino verso la breakout). Se non funziona neanche così allora il problema dev'essere un altro.

docdoc:
Per assicurarsene, credo sia opportuno verificare nelle specifiche di quel modulino RS232 l'uso di quei pin di handshake per capire se siano solamente "passanti" (come credo), o se ci faccia qualcosa.

sono "passanti", la gestione di quei segnali è sempre a cura del processore che gestisce la seriale, il modulo fa solo adattatore di livelli tra RS232 e UART per i vari segnali.

docdoc:
Si, possibile, hai ragione, non avevo letto il link, si vedono infatti solo i 2 segnali è GND.

Comunque non ci ha detto se dell'adattatore RS232 ha la versione M o F, e se ci fai caso la breakout ha RTS e CTS controllabili da appositi pin, non vorrei che sia il chip seriale onboard a non mandare nulla sulla seriale se lato Arduino non si alza uno dei due (a seconda se DTE o DCE).

Per assicurarsene, credo sia opportuno verificare nelle specifiche di quel modulino RS232 l'uso di quei pin di handshake per capire se siano solamente "passanti" (come credo), o se ci faccia qualcosa.

Se nessuno richiede handshake hardware allora essendo solo 3 pin il problema di cablaggio si riduce a quello che avete detto, ossia eventualmente inversione RX con TX (ma sul cavo, ovviamente, non su Arduino verso la breakout). Se non funziona neanche così allora il problema dev'essere un altro.

Grazie docdoc , effettivamente ho un connettore femmina proverò ad invertire i cavi e vi farò sapere domani

Grazie di nuovo