Programación Serial Port (RS-232)

B

Hola. Mi primer post en éste subforo, no sé porque no lo había visto antes. Parece que hay bastante calidad. :)

Al grano, tengo una aplicación que necesita comunicarse (escribir y leer parametros) con un microcontrolador a través del puerto serie RS-232. Necesito algún buen tutorial para alguien novato en comunicaciones con puertos serie.

La conexión inicial creo que ya la tengo, aunque tengo que indicarle manualmente qué puerto usar (lo suyo seria que lo detectara automáticamente al conectar el cable, no?), donde estoy más perdido es en el control del flujo de datos.
En Java, y estoy utilizando la librería javax.comm. He leído comentarios que no recomiendan RXTX, no sé bien porque, ya que viendo éste ejemplo http://rxtx.qbang.org/wiki/index.php/Two_way_communcation_with_the_serial_port es casi calcado a como se haría con la libreria de java.

Cualquier sugerencia es bienvenida.

PD: No se si esto es importante, pero la conexión es de USB a RS-232.


Tutoriales / ayudas:
http://www.csie.nctu.edu.tw/tsaiwn/rfid/03_HWKs/Java_javax.comm.pdf
http://en.wikibooks.org/wiki/Serial_Programming/Serial_Java#JavaComm_API
http://www.java2s.com/Code/Java/Development-Class/COM-Port.htm

MTX_Anubis

yo te recomiendo jssc

https://code.google.com/p/java-simple-serial-connector/

He usado rxtx y tenía problemas cuando desconectas y vuelves a conectar el dispositivo en la lectura del puerto teniendo, incluso, que reiniciar sesión y demás. No sé, a mi no me gustó y no vuelvo a rxtx ni loco.

Si estás con linux, puedes crear unas udev para el dispositivo y así no tener que asignarle el puerto a mano, creas un enlace simbolico con el mismo nombre siempre a ese dispositivo y te facilita la vida bastante. Si no, que alguien que haya trabajado con windows porque no sé si tiene algo parecido a las udev de linux.

Explica un poco lo que quieres hacer y pensamos qué diseño te puede venir mejor, si uno orientado a eventos, una cola de mensajes o directamente despacharlos según llegan. Todo depende de lo que se vaya a hacer y cuantos dispositivos vayas a usar a la vez :P

2 respuestas
B

#2 Pues oye, es tal cual a la de javax.comm xD Solo que más simple (de ahí el 'simple', ahora lo pillo).

Estoy (me veo obligado) en windows.

Sobre el diseño, te cuento mañana o pasado mañana, pues necesito familiarizarme un poco más.

Gracias por la ayuda! :)

PD: Contextualizando: departamento i+d de una empresa de electronica, y soy el 1er informático que entra. Estoy trabajando sobre un proyecto que ellos ya habían empezado, habian conseguido mas o menos lo que querian pero la aplicación se les colgaba siempre y cosas del estilo. Decidí rehacer todo desde 0, a parte de que así aprendo mejor como se programa para conexiones con puerto serie, porque su código es ilegible (han "aprendido" programar de forma autodidacta y deprisa y corriendo).

B

#2
Bueno, te cuento.

El microcontrolador tiene una serie de variables (unas 16), y necesito 2 funciones:
-Leer dichos parametros y que la aplicación los capture. La lectura no es constante, solo se lee cuando el usuario quiere.
-Escribir parametros indicados desde la aplicación (el usuario los introduce) al microcontrolador.

Al leer, se lee todo, en cambio al escribir no, solo se envia lo que el usuario desea.

Con qué tipo de diseño tengo que enfocarlo?

Un saludo.

MTX_Anubis

Explica mejor a qué te refieres con esto:

  • La lectura no es constante, solo se lee cuando el usuario quiere.

Entiendo que desde el punto de vista de un usuario, le doy a un botón para leer los parametros del microcontrolador (primera parte) y me aparecen en la pantalla. La segunda pues lo fácil, enviar datos al microcontrolador y listo.

La cosa está en cómo funciona el cacharro aunque imagino que será en plan:

  • Mando mensaje para solicitar estado
  • Cacharro devuelve el estado con sus variables
  • Devuelvo ACK

Luego en casa te hago un esquema de como he hecho yo las aplicaciones parecidas a esa

1 respuesta
B

#5 Sí, seria darle al boton 'Leer' y que te muestre los parametros. Me refiero a que la lectura no es en tiempo real (aunque hay unos sensores que si deberia mostrarlos en tiempo real, pero eso lo dejamos para el final).

Lo que es el código del microcontrolador (ya echo), pues no te sabria decir, pero tiene pinta a lo que dices tu.

edit: voy poniendo en #1 cosas que voy encontrando y me parecen bien.

B

Vale, he encontrado esto http://www.csie.nctu.edu.tw/tsaiwn/rfid/03_HWKs/Java_javax.comm.pdf y veo que en la pagina 4 se mencionan unos controles de flujo, cuál debería de escoger yo?

29 días después
B

Bueno, pues esto ya está. Si a alguien le interesa (comunicación del tipo envio orden, recibo datos, con buffers), se lo puedo pasar.

Tengo implementado todo lo que deseaba menos un detalle: que me autodetecte el puerto que está conectado. Ahora lo hago de la forma directa, indicando el nombre del puerto. La idea es facil: iterar todos los puertos serie, abrir puerto, enviar solicutud de ack, validar, y si es correcto, seleccionar dicho puerto. El caso es que a la practica es pesado: abrir streams, cerrarlos, hacer un write, read, y además tengo que controlarlo con temporizadores (no puedo escribir y leer al instante).

Alguna forma facil de hacerlo?

Usuarios habituales