arduino - rs232

ciao a tutti,
vi chiedo aiuto perchè non riesco a far funzionare bene la comunicazione fra due porte seriali gestite da arduino, mi spiego meglio:
ho seguido la guida presente su questo sito :Arduino, Max232 e comunicazione seriale – Parte 1 | Tecnicamente's Weblog

come faccio a vedere se la comunicazione funziona?

ho seguito anche il tutorial sulla pagina ufficiale http://arduino.cc/en/Tutorial/ArduinoSoftwareRS232, ma non ho i risultati aspettati. in quest ultimo caso, non leggo la parola hi, e non indietro il maiuscolo delle lettere inviate

in rete trovo schemi uno diverso dall'altro, qualcuno mi può indicare quello giusto? o perlomeno uno schema che funziona?
perchè quando faccio il test elettrico succede non riesco ad ottenere in uscita dal max232 i livelli di tensione necessari per lo standard 232

aureliusss:
ho seguito anche il tutorial sulla pagina ufficiale http://arduino.cc/en/Tutorial/ArduinoSoftwareRS232, ma non ho i risultati aspettati. in quest ultimo caso, non leggo la parola hi, e non indietro il maiuscolo delle lettere inviate

Questo é un esempio molto rozzo e brutto di come implementare iuna comunicazione seriale. Non ha un buffer e non puó spedire e in contemporanea ricevere dati.

Usa la seriale HW sui pin 0 e 1 o la libreria SoftwareSerial http://arduino.cc/en/Reference/SoftwareSerial.
Collega il TX di Arduino al T1in del MAX232 e il RX al R1out del MAX. Per il primo test collega il T1out con R1in e vedi se i dati mandati corrispondono a quelli ricevuti.

Ciao Uwe

ma sei i pin 0 e 1 sono già occupati dalla seriale HW come faccio a gestire la comunicazione fra due dispositivi?
il progetto finale che devo terminare come tesi consiste nell'usare arduino come 'ponte' fra due device collegati via seriale.
come test iniziale vorrei semplicemente far comunicare due porte seriali.
i problemi che ho incontrato sono due:

  1. non riesco a trovare uno schema hardware univoco per collegare il max232;
  2. non so come controllare sul pc la comunicazione
  1. non riesco a trovare uno schema hardware univoco per collegare il max232;
  2. non so come controllare sul pc la comunicazione
  1. Come collegamento, quello fornito dal Datasheet e' esatto. Consiglio solo di usare condensatori da 10µF.
    ATTENZIONE alla polarita' dei condensatori. E mettere i ponticelli sul connettore DB9, altrimenti il PC non sa' che c'e' una periferica collegata

  2. Un qualunque programma Terminal puo' gestire la comunicazione.
    Ma, visto che Arduino deve fare da "ponte" tra due PC, presumo che tu debba usare un "tuo" software di comunicazione

Ci spieghi meglio cosa vuoi fare ?

il progetto finale sarà il controllo remoto di un riflettometro attraverso seriale rs232. prima di passare alla gestione dello strumento, devo sapere gestire la comunicazione tra due serial devices collegati usando arduino come ponte, come gestore della comunicazione.

adesso, come test, vorrei semplicemente far comunicare due porte seriali.
esempio: se sul terminal dell'IDE arduino scrivo "ciao" allora l'altro terminale(quello che collego via rs232) mi risponde "ciao". spero di essere stato chiaro.

per questo vi chiedo, i pin di trasmissione e ricezione dell'integrato(11 e 12) non dovrebbero andare ad altri due pin digitali di arduino? se li collego a 0 e 1 occupo già la serialeHW, giusto?

Come ti ha gia' detto UWE, usa la SoftwareSerial http://arduino.cc/en/Reference/SoftwareSerial e scegli altri due pin per questa nuova seriale in piu'

nel link c'e' anche un esempio funzionante di lettura su una seriale e scrittura sull'altra

finalmente sono risucito a collegare tutti i componenti e a far funzionare il MAX232.
ora però mi sono abbastanza impu*****ato sul codice:

#define RX 6
#define TX 7

#include <SoftwareSerial.h>
#include <ctype.h>

String comando;
String string;
SoftwareSerial mySerial(RX,TX);

void setup(){
  
  Serial.begin(9600);
  Serial.flush();

  mySerial.begin(9600);
  mySerial.flush();
}

void loop(){

  float a,b;

  comando = "";

  if(Serial.available()){
    Serial.println("inserire il valore di a");
    delay(10);    
    a=Serial.parseFloat();
    mySerial.print("il valore di a e' ");
    mySerial.write(a);
    mySerial.println();
  }
  
  if(mySerial.available()){
    Serial.println("inserire valore di b");
    delay(10);
    b=Serial.parseFloat();
    mySerial.print("il valore di b e' ");
    mySerial.write(b);
    mySerial.println();
  }
  
  if(Serial.available()){
    Serial.print("inserire un comando da eseguire");
    comando = Serial.readStringUntil('\n');
    comando.trim();
  }
  
  mySerial.print("il comando da eseguire è " + comando);

  if(comando == "somma"){
    a=a+b;
    mySerial.print("il risultato e' " );
    mySerial.write(a);
  }
  else if(comando == "prodotto"){
    a=a*b;
    mySerial.print("il risultato e' ");
    mySerial.write(a);
  }
}

vorrei compiere una semplice operazione scrivendo, comunicando tra le due seriali, il problema è che non riesco a gestire proprio i tempi della comunicazione: quello che vorrei fare è questo:
1.serial dice:inserire valore di a;
2.inserisco valore di a;
3.mySerial dice: il valore di a è...;
4 serial dice : inserire valore di b;
5. inserisco valore di b;
6.mySerial dice : il valore di b è...;
7.serial dice: inserire comando da eseguire;
8.inserisco la stringa "somma" o "prodotto";
9. mySerial legge e interpreta la stringa;
10. mySerial mi restituisce il valore dell'operazione;

con il codice che ho scritto non riesco a ottenere passi "discreti" nel senso che non riesco a mettere in pausa la porta finchè non inserisco il valore o comando. suppongo che centri l'uso scorretto che faccio della funzione available().

mi potete aiutare?

Senza usare il loop fai così, la available ti dica il numero di caratteri in attesa, a te invece serve un carattere speciale che indichi la fine del numero

una roba del genere?

void loop(){
Serial.println("inserire valore di a");
Serial.readStringUntil('\n');
Serial.println(a);

bravo, esattamente. Ricorda che poi il loop, quando è finito, ricomincia.

quindi in quell'esempio continuerai a chiedere a e leggerlo, all'infinito, il che mi pare una buona cosa

il problema è che con questo tipo di codice sul monitor seriale continua a stampare "inserire il valore di a" anche se io non ho inserito nessun valore, del tipo:

inserire il valore di a
inserire il valore di a
inserire il valore di a
.
.
.
etc

io vorrei che succeda questo:
serial dice:inserire valore di a;
niente finchè non inserisco un valore;
inserisco un valore;
serial legge valore;
serial dice: il valore è "qualsiasi";

e adesso riparte il loop;

certo perchè tu fai

if(Serial.available()){

quindi se la seriale non ha caratteri salti la lettura. Invece tu devi metterti in attesa finchè non c'è qualcosa da scrivere;

while(Serial.available()==0){
  //aspetta
}

in pratica blecca il programma fiunchè non c'è qualcosa sulla seriale. non è detto che sia abbastanza per essere un float o che sia un valore valido, però