Go Down

Topic: Arduino conexion serie rs232 (Read 2194 times) previous topic - next topic

Armiduguel

Muy buenas a todos,

soy nuevo en el foro, he adquirido hace una semana un Arduino Uno R3, he estado bicheando un poco por internet para comprender el funcionamiento de mi Arduino pero soy novato y todavía tengo muchas dudas.

Lo que pretendo hacer es controlar un modem a través del Arduino pero como todos sabéis este modelo no dispone del conector db9 para poder conectarlo con el modem,

¿cómo puedo conectar la placa al modem?

- directamente el pin 0(RX) de la placa al pin 3(TX) del modem, el pin 1(TX) de la placa al pin 2(RX) del modem y GND de la placa al pin 5 del modem, también he leido que esta opción es peligrosa para la placa Arduino si los pines del modem tienen tensiones de +/- 12v.

- he encontrado un conversor ttl-rs23 el max232, si esta fuera la opción, ¿alguien podría ayudarme a realizarlo? no tengo intención de comprar uno.

- ¿alguna otra solución?

Salu2.

Cheyenne

Como bien dices los niveles de tensión RS232 son de +- 12 V mientras que en Arduino son TTL (0 - 5 V). Así que obligatoriamente necesitas el adaptador de niveles de tensión que suele implementarse con un max232. Yo lo compraría hecho en ebay, si lo quieres hacer seguro que en Google encontrarás muchos esquemas.
http://cuadricopterodiyarduino.blogspot.com/

jorgepl

Otra solución mucho más laboriosa sería empezar a trastear con el modem y ver si son accesibles las líneas de datos a niveles TTL y puentear al Arduino, es decir, ver si el modem también utiliza un driver RS232 y anularlo para comunicarse con el Arduino....Mucho trabajo y posibilidades de fallo y rotura para el coste que supone una plaquita de conversor de niveles RS232.

Si quieres información sobre módulos RS232 para Arduino hay bastantes hilos abiertos en el foro, por ejemplo:
http://arduino.cc/forum/index.php/topic,105434.0.html

Armiduguel

Muy buenas a todos

ya tengo mi max232 y funciona perfectamente, puedo conectar mi arduino + max232 + modem, si le envio un comando AT básico como puede ser el comando "AT" me devuelve sin problemas "OK", pero mi problema radica en que no salta el evento del puerto serie, es decir funciona con este código, pero nunca entra por la función serialEvent(), ¿alguna sugerencia?

#include <SoftwareSerial.h>

SoftwareSerial puerto(7, 8); // RX, TX
String comando = "AT";
boolean stringComplete = true;
String inputString = "";

void setup() 
{
  // para mostrar los datos en el IDE
  Serial.begin(115200);
  delay(2000);
// para comunicarme con el modem
   puerto.begin(9600);
  delay(2000);
}

void loop()
{
  Serial.println("Envio comando AT");
  puerto.println("AT");
  while(puerto.available())
  {
    byte aux = puerto.read();
    char uno = (char)aux;
    Serial.println(uno);
  } 
  delay(3000);
}

void serialEvent()

  Serial.print("Estoy en serialEvent: ");
  while(puerto.available())
  {   
    byte aux = puerto.read();   
    Serial.println(aux);
    inputString += (char)aux;   
  }
  Serial.println("Fin de SerialEvent:");
  Serial.println(inputString);
}

jorgepl


mi problema radica en que no salta el evento del puerto serie, es decir funciona con este código, pero nunca entra por la función serialEvent(), ¿alguna sugerencia?


Eso es porque serialEvent se ejecuta después del loop() y en el loop() ya haces la comprobación de datos y la lectura, por lo tanto, cuando termina el loop() ya no hay datos disponibles en el puerto serie, por lo que no entra en serialEvent.

Tienes que utilizar solo una de las dos posibilidades: serialEvent (con la comprobación del buffer dentro) o el if del serial.available en el loop().

Armiduguel

Perdonnnn con las prisas no me he explicado bien, quería decir que:
Así me responde el módem:
void loop()
{
  Serial.println("Envio comando AT");
  puerto.println("AT");
  while(puerto.available())
  {
    byte aux = puerto.read();
    char uno = (char)aux;
    Serial.println(uno);
  }
  delay(3000);
}

pero así no:

void loop()
{
  Serial.println("Envio comando AT");
  puerto.println("AT");
  delay(3000);
}

void serialEvent()
{
  Serial.print("Estoy en serialEvent: ");
  while(puerto.available())
  {   
    byte aux = puerto.read();   
    Serial.println(aux);
    inputString += (char)aux;   
  }
  Serial.println("Fin de SerialEvent:");
  Serial.println(inputString);
}


Muchas gracias Jorge por responder.

jorgepl

La razón por la que no te funciona es porque estás utilizando un puerto serie "virtual" creado con la librería SoftwareSerial.h

La función serialEvent solo funciona con el puerto serie real.

Si mandas algo a través del monitor serie del IDE cuando pruebes tu código, verás que si entra en serialEvent (aunque no entrará en el while)

Go Up