Este artículo describe la función de comunicación en serie implementada por Java. Compártelo para su referencia, como sigue:
Para implementar la comunicación en serie utilizando Java (en el sistema de Windows), debe usar el paquete de puerto serie Javacomm20-Win32.zip proporcionado por Sun. Se utilizan tres archivos, y la configuración es la siguiente:
1.comm.jar se coloca en java_home/jre/lib/ext;
2.PLECE win32com.dll a java_home/bin;
3.Javax.comm.Properties Ambos lugares deben colocarse
jre/lib (es decir, jre debajo de la carpeta Java)
Java_home/jre/lib/
Déjame hablar sobre el entorno que apliqué. Al pesar una escala electrónica, la computadora envía el comando "R" al monitor de control de peso a través del puerto serie, y el monitor de control envía los datos de peso al puerto serie una vez, y la computadora luego lee los datos para mostrarlo en la página web. Esto forma un sistema de pesaje en tiempo real.
El código para leer y escribir el puerto serie es el siguiente:
paquete com.chengzhong.tools; import java.io.*; import javax.comm.commportIdentifier; import javax.comm.*;/**** Este bean proporciona algunas funciones básicas para implementar el intercambio de información completo duplex*a través del puerto serie. **/clase pública serialbean {string portname estatical público estaticidentificante público; OutputStream Out; public static inputStream in; // Guardar el resultado de lectura de la cadena estática pública Result = ""; public static int openSignal = 1;/**** Constructor ** @param portid La ID de la serie que se utilizará. 1 para COM1,*2 para com2, etc. **/public SerialBean (int portid) {portname = "com" +portid;}/**** Esta función inicializa el puerto serie para la comunicación. Comienza un hilo* que monitorea constantemente el puerto serie. Cualquier señal capturada*del puerto serie se almacena en un área de amortiguación. **/public int Initialize () {openSignal = 1; intente {PortID = CommportIdentifier.GetPortAdidentifier (PortName); intente {serialport = (serialport) portid.open ("serial_communication", 2000); } Catch (PortInUseException e) {if (! SerialBean.portid.getCurrentowner (). Equals ("Serial_communication")) {opensignal = 2; // Este puerto serie está ocupado por otros programas} else if (serialBean.portid.getCurrentowner (). Equals ("Serial_communication")) {opensignal = 1; return OpenSignal; } return OpenSignal; } // Use InputStream en para leer desde el puerto serie, y emitir stream // sale para escribir en el puerto serie. intente {in = serialport.getInputStream (); out = serialport.getOutputStream (); } catch (ioException e) {openSignal = 3; // Inicializa los parámetros de comunicación a 9600, 8, 1, ninguno. Pruebe {SerialPort.SetSerialPortParams (9600, Serialport.Databits_8, Serialport.stopbits_1, Serialport.Parity_None); } capt (no comportadoComMoperationException e) {opensignal = 4; // El parámetro es un retorno incorrecto OpenSignal; }} Catch (nosuchportException e) {portid = null; opensignal = 5; // No hay OpenSignal de retorno del puerto serie; } // Cuando abra con éxito el puerto serie, cree un nuevo búfer en serie, // luego cree un hilo que acepte consistentemente señales entrantes de // el puerto serie. Las señales entrantes se almacenan en el búfer en serie .// return Success Information RETRUNN OPENSIGNAL;}/**** Esta función devuelve una cadena con una cierta longitud de los mensajes entrantes*. ** @param longitud la longitud de la cadena a devolver. **/public static void () {serialbean.resulto = "; int c; intit {if (in (in null) while (in.available ()> 0) {c = in.read (); Carácter d = nuevo carácter ((char) c); SerialBean.Result = SerialBean.Result.concat (D.ToString ()); }}} catch (ioException e) {// tODO Auto Generated Catch Block E.PrintStackTRace ();}}/**** Esta función envía un mensaje a través del puerto serie. ** @param msg la cadena a la cadena a ser sentado. **/public static void writePort (string msg) {tif! Msg.length (); }} catch (ioException e) {return;}}/**** Esta función cierra el puerto serie en uso. **/public void ClosePort () {Serialport.close ();}} De esta manera, puede obtener el resultado de lectura a través de SerialBean.result .
En cuanto a poner datos en una página web, AJAX debe usarse. Aquí hay un AJAX Framework DWR, la clase DWR Put.java se usa de la siguiente manera:
paquete com.chengzhong.dwr; import java.io.ioexception; import com.chengzhong.tools.arith; import com.chengzhong.tools.serialbean; public class put {//2011.9.17 public string write () {// envía instrucciones r, el instrumento envía a sierbean de sierbean de sierbeanes de datos netos de peso neto ("); // leer datos serialbean.readport (); Cadena temp = SerialBean.Result.trim (); // Estoy TEMP aquí para ser wn125.000kg de datos if (! Temp.Equals ("") && temp.length () == 11) {return (cambio (temp)). ToString (); } else {return ""; }} // Respuesta Comience a pesar Public String Startweight (String Num) {int n = Integer.ParseInt (num.trim ()); SerialBean SB = nuevo SerialBean (N); Sb.initialize (); return serialbean.opensignal+""; // Devuelve información de inicialización} // Respuesta Deje de pesar public Void Endweight () {try {// Cerrar las secuencias de entrada y salida serialbean.in.close (); Serialbean.out.close (); } Catch (ioException e) {// tODO Auto Generated BLOCK E.PrintStackTRace (); } if (SerialBean.SerialPort! = NULL) {SerialBean.SerialPort.Close (); // Cerrar el puerto serie} SerialBean.SerialPort = NULL; SerialBean.portid = nulo; SerialBean.Result = ""; } / ** * Convierta el peso en el formato de Wn125.000kg a 125.000 (kg) (redondeados, dos dígitos retenidos después del punto decimal) * / Cambio de cadena pública (fuente de cadena) {resultado doble = 0.0; Cadena S1 = Source.Substring (2,9); intente {result = double.parsedOuble (S1); resultado = arith.round (resultado, 2); } catch (Exception e) {E.PrintStackTrace (); devolver ""; } return resultado.toString (); }}NOTA: ARITH.JAVA es un archivo de cálculo de alta precisión para Java.
paquete com.chengzhong.tools; import java.math.bigdecimal;/*** Dado que los tipos simples de Java no pueden realizar operaciones con precisión en números de punto flotante, esta clase de herramientas proporciona operaciones precisas de punto flotante, incluida la adición, la subtracción, la multiplicación y la división, y la redondeo. */public class arith {// División predeterminada Precisión de operación privada estática final int def_div_scale = 10; // Esta clase no puede ser instanciada arith privada () {} /*** proporciona operaciones de adición precisas. * @param v1 agregado* @param v2 add* @return la suma de los dos parámetros*/ public static double add (double v1, double v2) {bigDecimal b1 = new BigDecimal (double.ToString (v1)); BigDecimal B2 = new BigDecimal (doble.ToString (V2)); return b1.add (b2) .DoubleValue (); } /*** proporciona operaciones de sustracción precisas. * @param v1 se resta* @param v2 se resta* @return la diferencia entre los dos parámetros*/ public static double sub (doble v1, doble v2) {bigDecimal b1 = new bigDecimal (doble.toString (v1)); BigDecimal B2 = new BigDecimal (doble.ToString (V2)); return b1.subtract (B2) .DoubleValue (); } /*** proporciona operaciones de multiplicación precisas. * @param v1 multiplicador* @param v2 multiplicador* @return producto de dos parámetros*/ public static double mul (double v1, double v2) {bigDecimal b1 = new BigDecimal (double.ToString (v1)); BigDecimal B2 = new BigDecimal (doble.ToString (V2)); return b1.multiply (b2) .DoubleValue (); } /** * Proporciona (relativamente) operación de división precisa, cuando no hay división, es preciso a * 10 dígitos después del punto decimal, y los números posteriores se redondean. * @param v1 divisor* @param v2 divisor* @return cita de dos parámetros*/ public static double div (doble v1, doble v2) {return div (v1, v2, def_div_scale); } /*** Proporciona (relativamente) operación de división precisa. Cuando no hay fin para completar la separación, el parámetro de escala se refiere a la precisión de *, y los números posteriores se redondean. * @param v1 divisor* @param v2 divisor* @param escala significa que debe ser preciso para varios dígitos después del punto decimal. * @return cociente de dos parámetros*/ public static double div (doble v1, doble v2, int escala) {if (escala <0) {tirar nueva ilegalargumentException ("La escala debe ser un entero o cero positivo"); } BigDecimal b1 = new BigDecimal (double.ToString (v1)); BigDecimal B2 = new BigDecimal (doble.ToString (V2)); return b1.divide (b2, escala, bigDecimal.round_half_up) .DoubleValue (); } /*** Proporciona un redondeo decimal preciso. * @param V cuenta que necesita ser redondeado* @param escala cuántos dígitos se conservan después del punto decimal* @return el resultado después de redondear*/ public static double (double v, int escala) {if (escala <0) {tirar nueva ilegalArgumentException ("La escala debe ser un entero o cero positivo"); } BigDecimal b = new BigDecimal (double.ToString (v)); BigDecimal One = new BigDecimal ("1"); return b.divide (uno, escala, bigDecimal.round_half_up) .DoubleValue (); }}En la página web:
<script type = "text/javaScript" src = "/chengzhong/dwr/motor.js"> </script> <script type = "text/javascript" src = "/chengzhong/dwr/util.js"> </script> <script type = 'text/javascript' src = '/chengzhong/dwr/dwr/ss.js> </script> </script> </script </script </script' script '/script " type = 'text/javaScript'> var id; función begin () {id = window.setInterval ('get ()', 500); // llame automáticamente a get () cada medio segundo, obtenga los datos de peso bruto y llénelo en el cuadro de texto} function get () {ss.write (readit); // llamando al método de escritura en la clase DWR PUT.Java} function Readit (data) {if (data! = Null && data! = "") {Document.getElementById ("mzbf"). Valor = data; }} </script>No hablaré sobre el uso de DWR
Para obtener más información sobre el contenido relacionado con Java, consulte los temas de este sitio: "Resumen de las habilidades de programación de socket de Java", "Resumen de las habilidades de operación de archivos y directorio de Java", "Tutorial sobre estructura de datos de Java y algoritmo", "Resumen de las habilidades de nodo de operación DOM de Java" y "Resumen de las habilidades de operación de java" "
Espero que este artículo sea útil para la programación Java de todos.