java - seriales - ¿Cómo configuro y me comunico con un puerto serie?
puertos seriales arduino mega (11)
Desde el otro lado, si quieres hacerlo usando C #, que se ejecutará tanto en Windows como en Linux, con algunas limitaciones (EDITAR: que puede estar desactualizado. No tengo forma de probarlo). Simplemente cree un objeto SerialPort , establezca su velocidad en baudios, puerto y cualquier otra configuración extraña, llame abierta sobre ella, y escriba su byte [] s. Después de toda la configuración, el objeto SerialPort actúa de forma muy similar a cualquier transmisión en red, por lo que debería ser fácil de descifrar.
Y como dice ibrandy, debe conocer todas estas configuraciones, como la velocidad en baudios, incluso antes de intentar comunicarse con cualquier dispositivo serie.
Necesito enviar y recibir datos a través de conexiones en serie (RS-232 y RS-422).
¿Cómo configuro y me comunico con esa conexión? ¿Cómo averiguo cuáles deberían ser los ajustes de configuración (por ejemplo, la velocidad en baudios) y cómo los configuro?
En particular, estoy buscando hacer esto en Java, C / C ++ o uno de los principales shells de Unix, pero también tengo cierto interés en la programación en serie usando Windows / Hyperterminal.
En el trabajo, utilizamos teraterm y realterm para verificar que los datos en serie estén formateados correctamente. También tenemos un divisor de hardware con un interruptor para que podamos monitorear el tráfico a nuestra aplicación a través de un cable a otro puerto.
Windows le permite acceder al puerto serie a través de CreateFile. Eso te da un control y desde allí puedes configurar el acceso.
Para C / C ++ en Windows tiene (al menos) dos opciones:
- Use la clase SerialPort proporcionada por .NET.
- Use la API de Win32. Hay un extenso artículo de MSDN que se remonta a 1995, y muchas bibliotecas gratuitas y ejemplos en la web para que comiences.
La opción .NET será mucho más fácil.
Si necesita ser una plataforma cruzada, sugeriría mirar Boost Asio .
Hace un tiempo escribí una aplicación de tamaño decente para enrutar conexiones desde una granja de módems hasta una dirección de red TCP / IP.
Inicialmente busqué una biblioteca Serial IO no grabada (gratis). Probé Sun''s, IBM''s y RxTx. Estaban bien para desarrollar la aplicación, y en las pruebas iniciales, pero en la producción demostraron ser inestables.
Finalmente pagué el SerialPort de SerialIO. Convertir más fue, literalmente, un ejercicio de cambio de importaciones, y la biblioteca ha sido absolutamente sólida: no puedo recomendarla lo suficiente. Mi aplicación se ha estado ejecutando en el campo las 24 horas del día, los 7 días de la semana, desde hace un par de años, sin que haya un solo problema para varios clientes.
Si comienzas el desarrollo usando SerialPort, tienen una mejor API y yo la usaría.
Si necesita soporte multiplataforma, Java con SerialPort fue la mejor opción que pude encontrar.
Por último, su licencia es bastante razonable siempre que no esté preinstalando software en el equipo para su (s) cliente (s).
Dependiendo del dispositivo con el que intente comunicarse, puede haber más parámetros que la velocidad en baudios, el número de bits de datos, el tipo de verificación de paridad y el número de bits de parada a considerar. Si recuerdo correctamente, los módems usan nueve líneas de la interfaz RS-232C. Algunos dispositivos como, por ejemplo, las cajas registradoras, pueden usar el apretón de manos de hardware en líneas RTS / CTS o en líneas DTR / STR.
En general, es bueno saber cómo funciona la interfaz. No puede comunicarse si la velocidad en baudios no coincide, pero la configuración incorrecta de otros parámetros podría funcionar. Por ejemplo, puede enviar fácilmente datos al dispositivo esperando 1 bit de parada con 2 bits de parada configurados. Los problemas comienzan cuando intenta recibir datos en tal caso. También puede usar un bit de paridad adecuadamente configurado como uno de los bits de parada, etc.
He estado usando purejavacomm: es una implementación de javax.comm escrita en Java + JNA puro
A diferencia de rxtx, no necesita instalar un dll. Está escrito en Java + JNA puro, que resolvió el problema de la portabilidad entre Windows y Linux para mí. Debería ser fácil realizar el acceso a otros sistemas operativos compatibles con JNA, como Solaris y FreeBSD, pero no lo he probado.
Puede esperar que una biblioteca java pura se quede atrás de una implementación nativa, como rxtx en rendimiento, pero con las CPU modernas, es muy probable que el cuello de botella sea la velocidad de bits de su puerto serie, no los ciclos de la CPU. Además, es mucho más fácil de depurar que una biblioteca Java / Native mixta o un código nativo compilado puro.
Si quiere codificar en Java, realmente recomiendo SerialPort Serial. Es muy fácil de usar y le ahorra días de trabajo. ¡Nunca encontré una biblioteca de código abierto tan buena como SerialIO, REALMENTE!
Mi consejo: ¡no utilices el marco serial IO de Sun! Es de 1998 y está lleno de errores. Puedes usar rxtx pero serialio es mejor!
Si no está obligado a utilizar un compilador particular, le sugiero que use Qt y en la nueva versión 5.3 encontrará una clase dedicada a los puertos seriales:
http://qt-project.org/doc/qt-5/qserialport.html
El código que va a escribir se ejecutará en todas las plataformas Qt suprimidas, al menos las que tengan puertos seriales.
¿Construir una máquina del tiempo y volver a 1987? Ho ho.
Ok, no más comentarios sarcásticos.
¿Cómo averiguo cuáles son los ajustes de configuración (por ejemplo, la velocidad en baudios)?
Lea la hoja de datos? Bien bien. En serio, el último. Si no conoce la velocidad en baudios del dispositivo con el que está tratando de comunicarse, tiene dos opciones. Comience a adivinar, o posiblemente reventar un o-scope. Si necesita un buen punto de partida, permítame sugerir 9600-8-N-1. Mi sospecha es que puedes llegar allí con la fuerza bruta relativamente rápido. Hay una tercera opción de tener un ninja de la vieja escuela que puede decir simplemente por el MIRAR de los personajes ilegibles a una velocidad en baudios estándar, cuál es la velocidad en baudios real. Un truco de fiesta impresionante para estar seguro.
Espero que tengas acceso a esta información. En Unix / Linux, puedes obtener minicom para jugar directamente con el puerto serie. Esto debería hacer que sea bastante rápido obtener la configuración resuelta.
una de las principales conchas de Unix
En Unix, los puertos serie se mapean en el subdirectorio / dev /. ttyS0, por ejemplo. Si configura la velocidad de transmisión correcta y otras cosas utilizando minicom, incluso puede enviar material a ese archivo para enviar material.
En lo esencial de la cuestión, puede acceder a ella programáticamente a través de los encabezados POSIX. termios.h es el más grande.
Ver: http://www.easysw.com/~mike/serial/serial.html#3_1 (NO DISPONIBLE MÁS)
pero también tengo cierto interés en la programación en serie usando Windows / Hyperterminal.
Hyperterminal y minicom son básicamente el mismo programa. En cuanto a cómo Windows le permite acceder al puerto serie, dejaré esa pregunta para otra persona. No he hecho eso en Windows desde los días Win95.
Desde Java, la biblioteca rxtx ( NOT DISPONIBLE ANYMORE ) es bastante buena. Comienza donde quedó el marco serial IO de Sun.