Go Down

Topic: arduino - rs232 (Read 1 time) previous topic - next topic

aureliusss

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 :http://tecnicamente.wordpress.com/2012/04/07/arduino-max232-e-comunicazione-seriale-parte-1/

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

aureliusss

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

uwefed


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

aureliusss

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

Brunello

Quote
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 ?

aureliusss

#5
Jan 12, 2013, 02:48 pm Last Edit: Jan 12, 2013, 02:56 pm by aureliusss Reason: 1
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?

Brunello

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

aureliusss

finalmente sono risucito a collegare tutti i componenti e a far funzionare il MAX232.
ora però mi sono abbastanza impu*****ato sul codice:
Code: [Select]
#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?

lesto

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
sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

aureliusss

una roba del genere?
Code: [Select]
void loop(){
Serial.println("inserire valore di a");
Serial.readStringUntil('\n');
Serial.println(a);

lesto

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
sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

aureliusss

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:

Code: [Select]
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;

lesto

certo perchè tu fai

Code: [Select]
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;

Code: [Select]

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ò
sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

Go Up
 

Quick Reply

With Quick-Reply you can write a post when viewing a topic without loading a new page. You can still use bulletin board code and smileys as you would in a normal post.

Warning: this topic has not been posted in for at least 120 days.
Unless you're sure you want to reply, please consider starting a new topic.

Note: this post will not display until it's been approved by a moderator.
Name:
Email:

shortcuts: alt+s submit/post or alt+p preview