Cet article décrit la fonction de communication série mise en œuvre par Java. Partagez-le pour votre référence, comme suit:
Pour implémenter la communication série à l'aide de Java (sous Windows System), vous devez utiliser le package de port série Javacomm20-win32.zip fourni par Sun. Trois fichiers sont utilisés et la configuration est la suivante:
1.Comm.jar est placé dans java_home / jre / lib / ext;
2.Placez win32com.dll à java_home / bin;
3.javax.comm.properties Les deux endroits doivent être placés
JRE / lib (c'est-à-dire Jre sous le dossier Java)
Java_home / jre / lib
Permettez-moi de parler de l'environnement que j'ai appliqué. Lors de la peinture d'une échelle électronique, l'ordinateur envoie la commande "R" au moniteur de contrôle de pesée via le port série, et le moniteur de contrôle envoie les données de poids au port série une fois, et l'ordinateur lit ensuite les données pour l'afficher sur la page Web. Cela forme un système de pesage en temps réel.
Le code pour lire et écrire le port série est le suivant:
Package com.chengzhong.tools; import java.io. *; import javax.comm.commportIdentifier; import javax.comm. *; / **** ce bean fournit quelques fonctions de base pour implémenter le duplex complet * l'information via le port de série. ** / public class serialBean {public static string portname; public static CommportIdentifier PortId; public statian sérialport static strealport; public static CommportIdentifier PortId PortId; public static SERIALPORT PORTNAPPORT; out; public static inputStream in; // Enregistrer le résultat de lecture publique static static result = ""; public static int opensignal = 1; / **** constructeur ** @param portid L'ID de la série à utiliser. 1 pour com1, * 2 pour com2, etc. ** / public serialbean (int portID) {portname = "com" + portid;} / **** Cette fonction initialise le port série pour la communication. Il démarre un fil * qui surveille régulièrement le port série. Tout signal capturé * à partir du port série est stocké dans une zone de tampon. ** / public int initialize () {openSignal = 1; essayez {portID = commptorIdentifier.getPortIdentifier (portname); try {serialport = (serialport) portid.open ("serial_communication", 2000); } catch (PortinUseException e) {if (! SerialBean.portId.getCurrentOwner (). equals ("serial_communication")) {openSignal = 2; // Ce port de série est occupé par d'autres programmes} else if (serialbean.portId.getCurrentOnner (). Equals ("serial_communication")) {openSignal = 1; retour OpenSignal; } return openSignal; } // Utilisez InputStream pour lire à partir du port série, et outputStream // pour écrire sur le port série. try {in = serialport.getInputStream (); out = serialport.getOutputStream (); } catch (ioException e) {openSignal = 3; // Initialisez les paramètres de communication à 9600, 8, 1, aucun. try {serialport.setSerialportParams (9600, serialport.databits_8, serialport.stopbits_1, serialport.parity_none); } catch (Uns-supportComMoperationException e) {openSignal = 4; // Le paramètre est un retour incorrect OpenSignal; }} catch (NoSuchPortException e) {portID = null; OpenSignal = 5; // Il n'y a pas de retour de port série OpenSignal; } // Lorsque vous ouvrez avec succès le port série, créez un nouveau tampon série, // Créez ensuite un thread qui accepte systématiquement des signaux entrants à partir de // le port série. Les signaux entrants sont stockés dans le tampon de série.// return Success InformationReturn OpenSignal;} / **** Cette fonction renvoie une chaîne avec une certaine longueur à partir des messages entrants. while (in.available ()> 0) {c = in.read (); Caractère d = nouveau caractère ((char) c); SerialBean.Result = SerialBean.Result.Concat (D.ToString ()); }}} catch (ioException e) {// TODO GÉNÉRATEUR AUTO GÉNÉRÉ BLOC E.PRINTSTACKTRACE ();}} / **** Cette fonction envoie un message via le port de série. ** @param msg la chaîne à envoyer. ** / Public Static Void WritePort (String msg) {try {if (Out! = Null) {pour (int i = 0; i <msg. i ++) out.write (msg.charat (i)); }} catch (ioException e) {return;}} / **** Cette fonction ferme le port série utilisé. ** / public void roserport () {serialport.close ();}} De cette façon, vous pouvez obtenir le résultat de lecture via SerialBean.result .
En ce qui concerne la mise en place de données sur une page Web, Ajax doit être utilisé. Voici un framework AJAX DWR, DWR Class Put.java est utilisé comme suit:
package com.chengzhong.dwr; import java.io.ioException; import com.chengzhong.tools.arith; import com.chengzhong.tools.serialbean; classe publique put {//2011.9.17 public String write () {// envoyer instruction r, l'instrument envoie des données de poids net serialbean.writeport ("r"); // Lire Data SerialBean.Readport (); String temp = serialbean.result.trim (); // je suis tempéré ici pour être wn125.000kg de données if (! Temp.equals ("") && temp.length () == 11) {return (change (temp)). ToString (); } else {return ""; }} // Réponse Démarrer Public String startweight (String num) {int n = Integer.ParseInt (num.trim ()); SerialBean SB = nouveau SerialBean (n); Sb.Initialize (); return serialbean.opensignal + ""; // Renvoi des informations d'initialisation} // Réponse Stop Pesant Public void Endweight () {try {// Fermer les flux d'entrée et de sortie serialbean.in.close (); Serialbean.out.close (); } catch (ioException e) {// TODO Bloc de capture généré automatiquement e.printStackTrace (); } if (serialbean.serialport! = null) {serialbean.serialport.close (); // Fermez le port série} serialbean.serialport = null; Serialbean.portId = null; Serialbean.result = ""; } / ** * Convertir le poids au format de WN125.000kg en 125.000 (kg) (arrondi, deux chiffres conservés après le point décimal) * / changement de chaîne publique (source de chaîne) {double résultat = 0,0; String S1 = Source.SubString (2,9); try {result = double.parsedouble (s1); résultat = arith.round (résultat, 2); } catch (exception e) {e.printStackTrace (); retour ""; } return result.toString (); }}Remarque: Arith.java est un fichier de calcul de haute précision pour Java.
package com.chengzhong.tools; import java.math.bigdecimal; / *** puisque les types simples de Java ne peuvent pas effectuer avec précision les opérations sur des numéros à point flottante, cette classe d'outils fournit des opérations précises à point flottante, y compris l'addition, la soustraction, la multiplication et la division et l'arrondi. * / classe publique arith {// la division par défaut Précision de l'opération de division Private statique final int def_div_scale = 10; // Cette classe ne peut pas être instanciée privée arith () {} / ** * fournit des opérations d'addition précises. * @param v1 ajout * @param v2 add * @return la somme des deux paramètres * / public static double add (double v1, double v2) {bigdecimal b1 = new BigDecimal (double.toString (v1)); BigDecimal B2 = nouveau BigDecimal (double.tostring (v2)); retour b1.add (b2) .doubleValue (); } / ** * fournit des opérations de soustraction précises. * @param v1 est soustrait * @param v2 est soustrait * @return la différence entre les deux paramètres * / public static double sub (double v1, double v2) {bigdecimal b1 = new BigDecimal (double.tostring (v1)); BigDecimal B2 = nouveau BigDecimal (double.tostring (v2)); Retour B1.Substract (B2) .DoubleValue (); } / ** * fournit des opérations de multiplication précises. * @param v1 Multiplicateur * @param v2 multiplicateur * @return Produit de deux paramètres * / public static double Mul (double v1, double v2) {bigdecimal b1 = new BigDecimal (double.toString (v1)); BigDecimal B2 = nouveau BigDecimal (double.tostring (v2)); retour b1.multiply (b2) .doubleValue (); } / ** * Fournit une opération de division précise (relativement) précise, lorsqu'il n'y a pas de division, il est exact à * 10 chiffres après le point décimal et les nombres suivants sont arrondis. * @param v1 Divider * @param v2 Divider * @return Quoation of Two Paramètres * / public static double div (double v1, double v2) {return div (v1, v2, def_div_scale); } / ** * Fournit une opération de division précise (relativement) précise. Lorsqu'il n'y a pas de fin pour terminer la séparation, le paramètre de l'échelle fait référence à la précision de *, et les nombres suivants sont arrondis. * @param v1 Divider * @param v2 Divider * @param échelle signifie qu'il doit être précis à plusieurs chiffres après le point décimal. * @return quotient de deux paramètres * / public static double div (double v1, double v2, int balance) {if (échelle <0) {lance un nouveau IllégalArgumentException ("l'échelle doit être un entier positif ou un zéro"); } Bigdecimal b1 = new BigDecimal (double.tostring (v1)); BigDecimal B2 = nouveau BigDecimal (double.tostring (v2)); retour b1.divide (b2, échelle, bigdecimal.round_half_up) .DoubleValue (); } / ** * Fournit un arrondi décimal précis. * @param v Counts qui doivent être arrondis * @param échelle combien de chiffres sont conservés après le point décimal * @return le résultat après l'arrondissement * / Double statique public (double v, échelle int) {if (échelle <0) {lancez un nouveau illégalargumentException ("L'échelle doit être un entier positif ou zéro"); } Bigdecimal b = new BigDecimal (double.tostring (v)); BigDecimal One = New Bigdecimal ("1"); retour b.divide (un, échelle, bigdecimal.round_half_up) .DoubleValue (); }}Sur la page Web:
<script type = "text / javascript" src = "/ chengzhong / dwr / moteur.js"> </ script> <script type = "text / javascrip type = 'text / javascript'> var id; fonction début () {id = window.setinterval ('get ()', 500); // appelle automatiquement get () toutes les deux secondes, obtenez les données de poids brut et remplissez-la dans la zone de texte} function get () {ss.write (readit); // Appel de la méthode d'écriture dans la classe DWR put.java} fonction leit (data) {if (data! = Null && data! = "") {Document.getElementByid ("mzbf"). Value = data; }} </ script>Je ne parlerai pas de l'utilisation de DWR
Pour plus d'informations sur le contenu lié à Java, veuillez consulter les sujets de ce site: "Résumé des compétences de programmation Java Socket", "Résumé des compétences de fichier Java et d'opération de répertoire", "Tutorial sur la structure de données Java et l'algorithme", "Résumé de l'opération Java Dom Skills" et "Résumé des compétences en opération de cache Java"
J'espère que cet article sera utile à la programmation Java de tous.