Comunicación Serie con Leonardo

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