Problema común
Javacomm y Rxtx tienen algunas cosas diferentes al instalar. Se recomienda instalar una pequeña instalación de acuerdo con las instrucciones de instalación. Si las instrucciones de instalación requieren un archivo jar o una biblioteca compartida deben estar en una carpeta específica, lo que significa que debe tomarse en serio. Si un archivo o dispositivo específico debe tener una propiedad o un derecho de acceso específico, también significa que debe tratarse en serio. Muchos problemas de instalación son causados por no de acuerdo con los requisitos de las instrucciones de instalación.
Cabe señalar que algunas versiones de Javacomm tendrán dos instrucciones de instalación. Uno se usa para Java 1.2 y más tarde, uno para la versión Java 1.1. El uso de las instrucciones de instalación incorrectas causará el resultado de instalación que no se puede funcionar. Por otro lado, algunas versiones/componentes/paquetes de TXTX contendrán descripciones incompletas. En este caso, es necesario obtener el código fuente publicado por RXTX, que contiene instrucciones de instalación completas.
Además, debe tenerse en cuenta que el programa de instalación JDK de Windows contendrá tres máquinas virtuales Java, por lo que habrá tres carpetas extendidas.
Además, incluso el cuarto JRE, que existe en la estructura del directorio de/Windows. Javacomm debe instalarse en JDK y todos los JRE público como extensiones.
Arte web
Javacomm
Un problema común sobre Javacomm y RXTX es que no admiten la instalación a través de Java WebStart: Javacomm's Infameo es porque debe llamar a un archivo llamado Javax.com.Properties al directorio JDK Lib, y esto no puede ser a través de Java WebStart completado. Es muy frustrante que la necesidad de este archivo sea algunos diseños innecesarios en Javacomm, y los diseñadores de Javacomm pueden evitarlo fácilmente. Sun rechazó obstinadamente el error, y enfatizaron que este mecanismo es esencial. Estaban hablando de tonterías, especialmente cuando mencionaron a Javacomm, porque Java tenía una arquitectura de proveedor de servicios que se especializa en tales intenciones durante mucho tiempo.
Solo hay una línea en el contenido de este archivo de atributos, que proporciona un nombre de clase Java impulsado local.
controlador = com.sun.win.win32driver
La siguiente es una técnica que puede implementar Javacomm a través de la web comienza a ignorar el archivo de atributos que perjudica el cerebro. Pero tiene defectos graves y puede fallar al implementar un nuevo Javacomm, si Sun hará una nueva versión.
Primero, apague el gerente de seguridad. Algunos estúpidos programadores de Sun sintieron que la existencia de los terribles archivos Javax.comm.Properties era genial una y otra vez, especialmente después de que se cargó por primera vez. Esto solo verifica si el archivo existe sin otras razones.
System.SetSecurityManager (NULL);
Luego, cuando la API Javacomm se inició originalmente originalmente, inicializó manualmente el controlador.
String Drivename = "com.sun.comm.win32driver";
Rxtx
RXTX necesita cambiar el derecho de propiedad y acceso del dispositivo serie en algunas plataformas. Esto también es algo que no se puede hacer a través de WebStt.
Cuando se inicia el programa, debe pedir a los usuarios que realicen la configuración necesaria como súper usuarios. En particular, RXTX tiene un algoritmo de coincidencia de modo para verificar el nombre del equipo en serie "legal". Cuando alguien quiere usar dispositivos no estándar, como el convertidor USB a serial, esto a menudo arruina las cosas. Este mecanismo puede ser bloqueado por atributos del sistema. Para obtener más detalles, consulte las instrucciones de instalación de RXTX.
API Javacomm
introducción
La API oficial de comunicación en serie de Java es Javacomm API. Esta API no forma parte de la versión estándar Java 2, por lo que la implementación de esta API debe descargarse por separado. Desafortunadamente, Javacomm no recibió suficiente atención al sol, y el tiempo de mantenimiento real no fue muy largo. Sun acaba de reparar algunos errores sin importancia ocasionalmente, pero no hizo un mantenimiento importante que haya expirado durante mucho tiempo.
Esta sección explica la operación básica de la API Javacomm. El código fuente proporcionado se simplifica para mostrar el foco, y debe mejorarse en aplicaciones prácticas.
El código fuente de este capítulo no es el único código de ejemplo disponible. Muchos ejemplos contienen descargas de Javacomm. Estos ejemplos incluyen más información sobre cómo usarlo que sus documentos API. Desafortunadamente, Sun no tiene un tutorial real o algunos documentos de explicación. Por lo tanto, para comprender el mecanismo de esta API, vale la pena aprender estos ejemplos, y aún necesita aprender este documento API. Pero la mejor manera es aprender estos ejemplos y usarlos. Debido a la falta de aplicaciones fáciles de usar y la comprensión del modelo de programación de estas API, las API generalmente son atacadas. En comparación con su reputación y función, esta API es mejor, pero eso es justo.
La API utiliza un mecanismo de devolución de llamada para notificar los nuevos datos del programador. Esta es una buena idea aprender este mecanismo, en lugar de confiar en el puerto de consulta. A diferencia de otras interfaces de devolución de llamada en Java (como: en la interfaz gráfica), esta interfaz solo permite escuchar un monitor. Si varios oyentes solicitan algunos incidentes, el dispositivo de monitoreo principal debe implementarse distribuyendo información a otros oyentes secundarios.
Descargar e instalación
descargar
La página web de Sun's Javacomm apunta a la dirección de descarga. Bajo esta dirección, Sun Actualmente (2007) proporciona la versión Javacom 3.0 que admite Solaris/SPARC, Solaris/X86 ya tiene Linux X86. Las descargas requieren una cuenta de una empresa Sun. La página de descarga proporciona un enlace a la página de registro. El propósito del registro no está claro. Al registrarse, los usuarios pueden descargar JDK y JRES, pero para estos Javacomm casi triviales, Sun Company citó disposiciones legales y restricciones gubernamentales sobre distribución y exportaciones de software.
El funcionario ya no proporciona la versión de Windows de Javacomm, y Sun ha violado su propia estrategia de muerte del producto, no se descarga en productos Java. Pero aún puede descargar la versión de Windows de 2.0 a partir de esto (Javacom 2.0).
Instalar
Instalación con las instrucciones de instalación con descarga. Algunas versiones de Javacomm 2.0 incluirán dos instrucciones de instalación. La diferencia más obvia entre estas dos descripciones es que la incorrecta se usa en el antiguo entorno Java1.1, y el adecuado para Java 1.2 (JDK1.2.html) es correcto.
Los usuarios de Windows pueden no darse cuenta de que han instalado la copia de la misma VM en diferentes lugares (generalmente de 3 a 4). Algunas aplicaciones IDE y Java también pueden traer su propio JRE/JRE privado. Por lo tanto, Javacomm debe instalarse repetidamente a estos VM (JDK y JRE) para que para desarrollar y ejecutar aplicaciones en serie.
IDE tiene una forma representativa de IDE de aprender una nueva biblioteca (clase y documento). Por lo general, el IDE no solo debe identificar una biblioteca que Javacomm no solo necesita ser identificada, sino que también se debe identificar cada proyecto que use la biblioteca. Al leer el documento IDE, debe prestar atención a la versión anterior del antiguo Javacomm 2.0 y la documentación de la API de Javadoc usan el diseño Java 1.0 Java DOC. Algunos IDES modernos ya no conocen estas estructuras y no pueden integrar documentos Javacomm2.0 en sus sistemas de ayuda. En este caso, se necesita un navegador externo para leer documentos (actividades recomendadas)
Una vez que se instala el software, se recomienda probar muestras y directorio javadoc. Tiene sentido construir y ejecutar aplicaciones de muestra para confirmar si la instalación es correcta. El programa de muestra generalmente requiere algunos pequeños ajustes para ejecutarse en una plataforma especial (como el identificador de puerto COM que reescribe códigos duros). Al ejecutar un programa de muestra, es mejor tener un hardware en serie.
Serial_programming: conexiones RS-232 y serial_programming: los módems y los comandos AT proporcionan información sobre cómo crear un entorno de desarrollo de aplicaciones en serie.
Encuentra el puerto serie esperado
Las primeras tres cosas que se deben hacer al usar Javacomm Serial Programming
El logotipo del puerto de las expectativas de enumeración y selección se completa en el mismo ciclo:
Import javax.comm.*; Como "com1" ... "comx", y no // por sus nombres de dispositivos unix "/dev/tty ...". En su lugar, el usuario configurable.//string WantedPortName = "/dev/ttya"; Identificador if // (a) Indica un puerto de serie (no un paralelo), y // (b) coincide con el nombre de diseño .//commportIdentifier Portid = NULL; CommtionIdifier PID = (CommtionIdifier) PortAblentifiers.NextElement (); ) {System.err.println ("No pudo encontrar el puerto serie" + WantedPortName); Lista de logotipo en serie accesible predeterminado en el controlador relacionado con una plataforma específica que está vinculada. Esta lista no se puede configurar a través de Javacomm. Los métodos comptidifier.addportname () son engañosos, porque la clase de conductor está relacionada con la plataforma, y su implementación no es parte de la API pública. Confiando en el controlador, esta lista de puertos se puede configurar/extenderse en el controlador. Por lo tanto, si Javacomm no encuentra un cierto puerto, algunos cambios en el conductor a veces ayudan. Una vez que se encuentra cierto identificador de puerto, puede usarlo para obtener el puerto esperado: ///////////////////////// 0 Use identificador de puerto para cuenta // Serialport Port = NULL; e);
Puerto serie de inicialización
La inicialización del puerto serie es muy intuitiva. Puede establecer los parámetros de comunicación (tasa de potencia, bit de datos, bit de detención y verificación de títeres) uno por uno.
Como parte de la inicialización, el flujo de comunicación de entrada y salida se puede configurar en el siguiente ejemplo.
Importar java.io.*; //// Establezca todos los parámetros. ; ///// Abra el lector de entrada y la transmisión de salida. NULL ;/ solo para fines de demostración. Tenput Stream: solo escritura "); nuevos sistemas de Linux que dependen de Unicode, por lo que podría ser necesario para // especificar el esquema de codificación que se utilizará), o ISO Latin 1 (8 bit // comunicación), ya que es probable que no haya modelo de aceptación // unicode para su compromiso. Suceder aquí // interpretarwritecode (); //////////////////// es muy Puerto.
Transmisión de datos simple simplemente escriba datos
Escribir los datos en el puerto serie es tan simple como el Java IO básico. Pero todavía hay algunas precauciones cuando usa el protocolo AT Hayes:
Portapapeles
Hacer:
Explique cómo mezclar la entrada y la salida de binario y caracteres en la misma transmisión
Modificar el programa de muestra para usar el flujo
// Escribir a la salida OS.print ("at"); OS.print ("/r/n"); Comandar que le envió.Lectura de datos simple (rotación)
Si usa la operación de escritura correctamente (como se describió anteriormente), solo necesita un comando simple.
// Lee la respuesta de Response = IS.ReadLine ();
Preguntas simples de lectura y escritura
La simple lectura y escritura en serie demostradas en la sección anterior tiene defectos muy graves. Todas las operaciones se realizan bloqueando la E/S. Esto significa que cuando no hay datos legibles, o el búfer de salida está lleno (el dispositivo no puede aceptar más datos):
El método de lectura y escritura (en el ejemplo anterior es OS.print () o IS.Readline ()) no regresará, lo que hace que la aplicación sea suspendida. Más precisamente, los hilos de lectura y escritura están bloqueados. Si ese hilo es el hilo principal de la aplicación, la aplicación se detendrá hasta que se liberen las condiciones de bloqueo (es decir, datos legibles para alcanzar o el dispositivo se recreativa).
A menos que la aplicación sea la más primitiva, el programa está bloqueado. Por ejemplo, al menos debe permitir a los usuarios cancelar las operaciones de comunicación. Esto requiere el uso de E/S de no bloqueo o E/S asincrónica. Sin embargo, Javacomm se basa en el sistema de E/S estándar (InputStream, OutputStream), pero puede usar una técnica de deformación que se muestra más adelante.
La "técnica de deformación" llamada SO es un soporte limitado proporcionado por el Javacomm a la E/S asincrónica a través del mecanismo de notificación de incidentes. Sin embargo, las soluciones comunes para realizar E/S sin bloqueo en Java para bloquear la E/S son hilos. Esta solución para la operación de escritura de puertos en serie es práctica y factible.
Las operaciones de lectura también deben procesarse en un hilo separado, pero no es necesario utilizar el mecanismo de notificación de incidentes de Javacomm. Resumir:
Lea la operación y use la notificación de eventos y/o el hilo separado;
Use hilos separados para escribir operaciones, y se puede seleccionar el mecanismo de notificación de eventos.
La siguiente parte presentará otros detalles.
Event Drive Introducción de comunicación en serie
La API Javacomm proporciona un mecanismo de notificación de eventos para superar los problemas causados por el bloqueo de E/S. Pero este mecanismo también es problemático en este método Sun típico.
En principio, una solicitud puede registrar un monitor de eventos en un puerto serie específico para recibir notificaciones para recibir eventos importantes en este puerto. Los dos eventos más interesantes de lectura y escritura de datos son
javax.comm.serialporteVent.data_available y javax.comm.serialportevent.output_buffer_empty.
Pero esto también trae dos preguntas:
Antes de realizar discusiones detalladas, la siguiente sección demostrará el método principal para implementar y registrar un procesador de eventos en serie. Recuerde que solo hay un procesador de eventos en un puerto serie, y tiene que lidiar con todos los eventos posibles.
Establecer procesador de eventos en serie
Importar javax.comm. Información * sobre la comunicación, por ejemplo, cuando se debe seguir un protocolo de comunicación particular *. Método. Event.getEventType ()) {case serialportEvent.output_empty: outputBuFerEmty (evento); ; Break; / ** * Manejar eventos vacíos de búfer de salida. / Implementar datos de WU aquí}/ ** * Manejar los datos disponibles. Una vez que se implementa el oyente, se puede usar para monitorear incidentes en serie específicos. Para hacerlo, debe agregar una instancia de escuchar el puerto serie. Además, la recepción de cada tipo de evento requiere aplicaciones separadas.
Serialport Port = ...; Imágenes La interfaz de ServiceVentListener // uno llamará ///port.addeventRistener (esto); E) Otros eventos no utilizados en este ejemplo-> ;
Redacción de datos
La redacción de datos con separación separada es solo un propósito: para evitar todo el bloque de aplicaciones bloqueado porque un puerto serie no está listo para escribir datos.
Una realización simple de búfer de anillo de hilo y hilo
Use un hilo independiente de la línea de programa principal para escribir operaciones, lo que indica que los datos que deben escribirse de alguna manera se envían al hilo de escritura desde el hilo de la aplicación principal (hilo principal). Esto puede usar un búfer de eventos asincrónicos compartidos, como una matriz de bytes. Además, el programa principal también necesita alguna forma de determinar si los datos o el búfer de datos se pueden escribir en el búfer de datos. Si el búfer de datos está lleno, indica que el puerto serie no está listo para escribir operaciones, y los datos a salir están haciendo cola. El programa principal necesita consultar un nuevo espacio libre disponible en el búfer de datos compartidos. Sin embargo, en la brecha entre el programa principal, puede hacer algunas otras cosas, como actualizar la interfaz de usuario (GUI), proporcionando un símbolo del sistema que puede salir de datos, etc.
A primera vista, PipeDInputStream/PipeDoutputStream es una buena idea para esta comunicación. Pero si el flujo de la tubería es realmente útil, entonces el sol no es Sun. Si el PipeDoutStream correspondiente no se limpia a tiempo, PipeDInputStream bloqueará, lo que bloqueará el hilo de la aplicación. Incluso si usa hilos independientes, no puede evitarlo. Java.nio.pipe también tiene el mismo problema que este. Su obstrucción está relacionada con la plataforma. No es muy bueno cambiar la E/S tradicional usando Javacomm a NIO.
En este artículo se utiliza un área de búfer de anillo síncrono muy simple para la transmisión de datos de subprocesos. Es probable que las aplicaciones en el mundo real usen un amortiguador más complejo. Por ejemplo, la realización de un mundo real requiere un búfer de operación desde la perspectiva del flujo de entrada y salida.
Tal búfer de anillo no es especial, y no hay un atributo especial en el procesamiento de subprocesos. Es solo una estructura de datos simple utilizada aquí para proporcionar búfer de datos. El búfer se ha implementado aquí para garantizar que el acceso a la estructura de datos sea la seguridad de los subprocesos.
/*** Buffer de raing sincronizado.*Adecuado para la mano de un hilo a otro. ** Tamaño del búfer ** / Tamaño de INT protegido; Tamaño de 1K. Clear ();} / ** * Borrar el contenido del búfer. estar sobrescribido durante la operación normal. , * No es luego válido cuando se leen los datos del * búfer o escriben el búfer. Int data () {return start <= end? . Datos como Posses. Param Data Holting Data a escribir * @param Off Official de datos en la matriz * @param n Cantidad de datos para escribir, comenzando desde. , int n) {if (n <= 0) return 0; ) -d); , end> = inicio? } / ** * Lea tantos datos como se posee desde el búfer. Longitud);} /** * Lea la mayor cantidad de datos como posee desde el búfer. */ int Read (Byte Data [], int Office Lid: 0 = <= off <data.length; tire excepción si no int i = math.min (permanece, (end <start? buffer.length: end) -Start ); 0;} i = Math.Min (permanecer, end> = inicio? 0: end); i;} return n -remain;}}}}}Al usar este búfer de anillo, ahora puede enviar datos de un hilo a otro hilo. Por supuesto, otros hilos son métodos seguros y sin bloqueo. El punto clave aquí es que cuando el búfer está lleno o el búfer está vacío, la lectura y la escritura de los datos no causará bloqueo.
De acuerdo con el esquema del procesador de eventos, demostración de la demostración de sección en el "Procesador de empresa Crear en serie", puede usar el búfer de anillo compartido introducido en el "búfer de anillo simple y seguro de subprocesos" para admitir el evento output_buffer_empty. No toda la implementación de Javacomm admite este evento, por lo que es posible que este código nunca se llame. Pero si puede, es parte de garantizar el mejor rendimiento de datos, ya que puede hacer que el puerto serie en un estado de ociosidad durante mucho tiempo.
El esquema del monitor de eventos debe proporcionar un método emoticRempty () es el siguiente:
RingBuffer Databuffer = ...; / ** * Manejar los eventos vacíos del búfer de salida. outputBuff On (Evento SerialPortEvent) {}El siguiente ejemplo supone que el destino de los datos es un archivo. Cuando llegan los datos, se eliminará del puerto serie y se escribirá en el archivo de destino. Esta es solo una vista refinada, porque de hecho necesita verificar el logotipo de los datos EOF para regular el módem (generalmente llamado "CAT") como el modo de comando.
Import javax.comm. *; ** * Manejar el evento serial. SerialPortEvent.data_available: // // Mueve todos los datos disponibles al archivo // intenta {int c; Catch (IOException Ex) {...} Break; );}
Modificar el control del demodulador
Javacomm se preocupa principalmente por un procesamiento en serie y la transmisión de datos en el puerto serie. No comprende ni proporciona soporte para protocolos de alto nivel, como las instrucciones de modulación y demodulación de Hayes, generalmente se usan para controlar los gatos de nivel de cliente. Esta no es la tarea de Javacomm, ni es un error.
Al igual que otros dispositivos serie especiales, si desea controlar un gato con Javacomm, debe escribir el código necesario en Javacomm. La página "módems de composición de Hayes y comandos AT" proporciona la información básica necesaria para procesar los gatos Hayes.
Algunos sistemas operativos, como Windows o un comando de control de Linux para configurar un tipo especial o marca de comandos de control CAT, proporcionan más o menos estándares. Por ejemplo, el "controlador" de Windows Cats suele ser solo entradas registradas, que describen gatos individuales (el controlador real es un controlador de modulación en serie universal). Javacomm no puede obtener datos específicos de tales sistemas operativos. Por lo tanto, se debe proporcionar una herramienta Java separada para permitir a los usuarios configurar una aplicación para usar gatos individuales o agregar algún código de plataforma (local) correspondiente.
Rxtx
Descripción general y versión
Dado que Sun no proporcionó la implementación de referencia de Javacomm para Linux, las personas han desarrollado RXTX para Java y Linux. Más tarde, RXTX fue trasplantado a otras plataformas. Se sabe que la última versión de RXTX ejecuta más de 100 plataformas, incluidas Linux, Windows, Mac OS, Solaris y otros sistemas operativos.
RXTX se puede usar independientemente de la API de Javacomm, o también se puede usar como un servicio de API Java Commum llamado SO. Si este último usa un paquete de embalaje llamado JCL. JCL y RXTX generalmente están llenos de Linux/Java, o JCL está completamente integrado con el código. Por lo tanto, antes de descargarlos uno por uno, eche un vistazo al CD de la versión de distribución de Linux de CD.
Debido al apoyo limitado de Sun y la documentación inapropiada de Javacomm, abandonó la API de Javacomm y giró directamente para usar RXTX en lugar del paquete de empaque JCL. Sin embargo, los documentos de RXTX son muy raros. En particular, a los desarrolladores de RXTX les gusta hacer que sus versiones y contenido de bolsas sean un desastre (como usar o no utilizar JCL integrado). A partir de la versión 1.5, RXTX incluye una clase alternativa de la clase pública Javacomm. Debido a razones legales, no estaban en el paquete Java.Pomm, sino bajo Gui.io. Sin embargo, la versión existente del contenido de empaque es muy diferente.
Por lo tanto, si desea programar la API Javacomm original
Sun Javacomm Edición General. Al escribir este artículo es en realidad el paquete Unix (que incluye soporte para varios tipos de sistemas UNIX, como Linux o Solaris), incluso en Windows, este paquete Unix también debe usarse para proporcionar una implementación universal de Java.comm. Solo usar Java para implementar esa parte se utilizará, pero la biblioteca local de Unix será ignorada.
RXTX 2.0, para tener diferentes proveedores en la versión universal del Javacomm, a diferencia del paquete Javacomm. Sin embargo, si solo desea reemplazar el paquete con Gnu.io, solo necesita convertir una aplicación Javacomm en una aplicación RXTX.
Si renuncia a uno de los muchos miembros de los muchos miembros que hacen de Javacomm que decepcionó con el comportamiento de soportar ventanas, entonces debe transferir su Javacomm a RXTX. Como puede ver anteriormente, hay dos formas de completar esto.
上面的第一项在前面已经解释,第二项也相当简单。 For those who need to transplant JavacomM to RXTX 2.1, you only need to replace all the references to the "java.Comm" package in the application source code to the "GNU.IO" package. If the original JavaComm application is proper Other things Necesita hacerse.
在Unix平台上,RxTx 2.1甚至提供了工具“contrib/ChangePackage.sh”去在源代码树形结构中执行全局的替换,这样的替换在其他的平台很容易使用支持重构功能的IDE(集成开发环境)来完成。