Comunicación Serie con Leonardo

Hola!

Acabo de estrenar mi nueva placa Arduino Leonardo.
Al tener la placa UNO conectada, no quería cargar los drivers.... pero yastá!, desconectada la UNO, ha entrao como un tiro.
He probado la salida por emulación de Keyboard y es una bestialidad... fantástica... le sacaremos mucho provecho... genial idea...

Sin embargo, estoy queriendo aprovechar algunos programas en C++ que utilizaba con UNO por el puerto serie... y NO HAY MANERA...
ni por la consola del IDE de arduino soy capaz de comunicarme con Leonardo... a veces incluso parece que se queda colgao...

Y el caso es que quiero que sea este el principal camino de comunicación con la placa...

Quedo a la espera de vuestras sabias sugerencias ... que las pienso probar toooodas.

Gracias a todos.

Estas usando Serial o Serial1?

El atmega 32u4 (Leonardo,vinciduino, etc) usa Serial1 para comunicar con pines 0 y 1(hardware) el Serial esta reservado para el puerto de serie virtual.

Si entiendo correctamente, el serial por el conector USB es el puerto serie virtual que se crea en el PC en la conexión... y puedes acceder vía "Serial.print... Serial.read... etc" y los pines 0 y 1 vía "Serial1.print... Serial1.read... etc".
Pero el problema que encuentro es que no responde al camino "Serial" o puerto virtual. Es decir, no puedo enviar ni recibir nada por ese puerto.
Quedo a la espera de sugerencias
Gracias

Hola! Has solucionado tu problema? Yo tambien tengo problemas para comunicar una Leonardo con una UNO. Utilizo modulos XBee para conexion serie inalambrica. Entre dos UNO no hay problema.

Bueeeeno,

Después de revender, hace un año, el Arduino Leonardo por ser incapaz de comunicarme correctamente con él, esta semana me he comprado un Arduino MICRO... y me he encontrado con el mismo problema!!! joojojojo. Así que ha llegado la hora de saber qué demonios pasa con las comunicaciones de estos bichos...

Resulta que Leonardo y Micro disponen del mismo procesador con el manejo del puerto USB integrado, no como el resto de las placas, que tienen un procesador para comunicación USB dedicado.

El caso es que este tipo de procesador crea un puerto COM virtual a través de su conexión, trabajando como una instancia CDC(Connected Device Class) del driver USB... vamos... como funcionan las conexiones que se establecen con los ratones o los teclados vía USB.

Este tipo de dispositivos necesitan una configuración del puerto serie muy concreta para poder recibir datos y recoger sus envíos desde un programa en C++ (imagino que pasará lo mismo en cualquier lenguaje, puesto que el problema depende solo de la configuración del puerto). Y la solución no es más que habilitar el Request To Send (RTS) y el Data Terminal Ready (DTR), como método de control de flujo por el puerto.

En las configuraciones por defecto que he visto está deshabilitado, de modo que ya sabéis.

Yo utilizo una librería de comunicación serie muy versátil, puesto que se puede utilizar tanto en desarrollos para linux como para windows, con comandos muy sencillos y la configuración del puerto absolutamente transparente.

Se trata de http://lnxcomm.sourceforge.net/, desarrollada por Fernando Pujaico Rivera. En ella está deshabilitado el RTS y el DTR por defecto, pero se puede habilitar fácilmente con el método Set_Hands_Haking(HANDLER, 0).

Para los amantes de meterse en las tripas de la configuración, que sepáis que en WIndows se debe especificar, dentro de la estructura DCB que contiene los parámetros del puerto serie, los miembros:
fDtrControl = DTR_CONTROL_ENABLE
fRtsControl = RTS_CONTROL_ENABLE
para los linuxeros... sin dar mucha seguridad en mis comentarios siguientes... creo que se debe habilitar así:
c_cflag &= ~CRTSCTS
c_iflag &= ~(IXON | IXOFF | IXANY)
c_cc[VSTART] = 0
c_cc[VSTOP] = 0

En fin... una alegría para mi cuerpo haber podido encontrar la manera de resolverlo... que, por cierto, debo agradecer a un hilo de este foro... http://forum.arduino.cc/index.php/topic,110942.0.html

Buenas:

Estoy probando el puerto serie del Teensy ++ 2.0 y se me cuela por el COM3, el del propio USB que conecta el dispositivo.

¿Cómo hago para que me funcione los envíos y recibos de datos por los pines físicamente?

He probado ejemplos y esto de Serial o Serial1 nome va.

Lleva un AT90USB1286.

Los pines puedes verlo en la página 13 y 14 de este tutorial.

Por lo que veo, Arduino le cuesta mucho trabajar o hacer que funcione el puerto COM físico. Me va de maravilla hacer mi propia interfaz con Visual C# y Visual Basic .net/C++ con un PIC16F84A en ensamblador. Ahora quiero probar con AVR bajo Arduino.

¿Hay código genérico sobre puerto com para controlar Rx y Tx, los pines físicos?

Es para hacer pruebas, por que los ejemplos que te vienen solo me funcionan en el virtual. Busco código que envíe un caracter en hexadecimal, 0xF4, por poner un ejemplo. También que el Arduino reciba carácteres. Ya me encargaré de ponerle un LCD y que lo refleje. Tanto el que envía como recibe.

:wink:

hola, yo tuve un problema similar y creo que lo solucione.

les paso el codigo que utilice para conectar leonardo con un modulo gsm (el modulo seteado rx en el pin 0 y tx en el pin 1) por el puerto serie, a lo mejor les sirve a uds.

// This is example for communicating with GPS/GPRS/GSM V3 from DFRobot
// Works with Arduino Leonardo ONLY!

// S1 in Comm, S2 in Arduino, GSM/GPS switch at the middle
// Do not respect IDE errors about serial port busy
// Flash, wait till "stat" is on (no need to wait blink)
// Open serial monitor, set line ending to "Newline" and enter ATZ (NOT atz), you should see
// K: ATZ
// ATZ
// OK
// led is blinking for "i am alive" purpose
// Useful command
// AT+COPS? - current GSM mode and operator
// AT+CPIN? - need pin? p.72-73 on SIM908 command manual.pdf from DFRobot
// AT+CREG? - what about network registration? if return +CREG: 0,1, so 
// automatic network registration IS DISABLED by sim (0), but home network is available(1)
// AT+CREG=2 - register to network and set it automatic
// AT+CSQ - signal level
// AT+CNUM - my number
// ATDnumber; - call prone number. remeber ";" at end




#define gps_connect()    digitalWrite (0, LOW)
#define gps_disconnect()   digitalWrite (0, HIGH)
 
#define gsm_connect()    digitalWrite (1, LOW)
#define gsm_disconnect()   digitalWrite (1, HIGH)

void setup()
 {
  // USB serial 
  Serial.begin(9600);
  // sim serial
  Serial1.begin(9600);
  
  // sim connected to this pins
  pinMode(0,OUTPUT);
  pinMode(1,OUTPUT);
  pinMode(6,OUTPUT);
  
  // truen on/off sim. low-wait-high. if stat is off, just reset board again
   
  digitalWrite(6,LOW); 
  delay(1200);
  digitalWrite(6,HIGH);
  delay(1200);
  
  // connect gsm rx/tx and disconnect gps rx/tx
  gsm_connect();
  gps_disconnect();
}

char s;
String txtMsg;

void loop()    
{  
   digitalWrite(13, LOW); 
   delay(500);
   // does anything from serial monitor?
   while (Serial.available() > 0)
     {
      s=(char)Serial.read();
        if (s == '\n')
          {
            Serial.print("K: ");
            Serial.println(txtMsg); // send reply to serial monitor
            Serial1.println(txtMsg);  // send to sim
            txtMsg = "";
          } else {
          txtMsg +=s;
          }
      }
   // does anything from sim?
   while (Serial1.available() > 0)
     {
       s=(char)Serial1.read();
      Serial.print(s);
      }
   digitalWrite(13, HIGH); 
   delay(100);
 }

Espero les sea util. de no ser así, disculpas

saludos

Hola. tengo el problema que en windows 7 no me permite habilitar el RTS para poder programar las pro mini. y no soy muy entendido de programacion. estuve urgando un poco en los links que mostraste pero no entiendo como se hace. me podria explicar que debo hacer?
Desde ya muchas gracias.