Un cours récent nécessite d'écrire un outil de communication en série pour les ordinateurs supérieurs. J'ai écrit un simple outil de communication série avec une interface graphique basée sur Java. Le processus sera décrit en détail ci-dessous pour votre référence ^ _ ^
un:
Tout d'abord, vous devez télécharger un package JAR supplémentaire qui prend en charge l'opération de communication du port série Java. Étant donné que Java.comm est relativement ancien et ne prend pas en charge les systèmes 64 bits, il est recommandé de faire un package JAR RXTX (support 32 bits / 64 bits).
Adresse de téléchargement officiel: http://fizzed.com/oss/rxtx-for-java (Remarque: FQ peut être tenu de télécharger)
Les chaussures pour enfants qui ne peuvent pas être FQ peuvent être téléchargées ici:
http://xiazai.vevb.com/201612/yuanma/javamfzrxtx(vevb.com).rar (32 bits)
http://xiazai.vevb.com/201612/yuanma/javamfzrxtx(vevb.com).rar (64 bits)
deux:
Téléchargez le package JAR Unzippepped et introduisez-le sous Java Build Path:
capturer
Remarque: Si une erreur java.lang.unsatisfiedLinkerror est lancée pendant le fonctionnement, veuillez copier les deux fichiers de rxtxParallel.dll et rxtxserial.dll dans le package de décompression RXTX dans le répertoire C: / Windows / System32 pour résoudre l'erreur.
trois:
En ce qui concerne l'utilisation de ce package JAR, j'ai écrit une classe SerialTool.Java, qui fournit divers services simples pour la communication du port série. Le code est le suivant (notez que cette classe est située dans le package Serialport):
Package Serialport; Importer java.io.ioException; import java.io.inputStream; import java.io.outputStream; import java.util.arraylist; import java.util.enumeration; import java.util.toomanyListenersException; import gnu.io.comport; importer gnu.io.Comport GNU.io.portInUseException; Import Gnu.io.Serialport; Import Gnu.io.SerialportEventListener; Import Gnu.io.UnSupportedComMoperationException; Importer SeriaException. *; / ** * SERE PORT SERVICE SÉRIEUS SerialTool {private static serialTool serialTool = null; statique {// Initialisez un objet SerialTool lorsque cette classe est chargée par classloader if (serialTool == null) {serialTool = new SerialTool (); }} // Le constructeur de la classe privée SerialTool n'est pas autorisé à générer des objets SerialTool Private SerialTool () {} / ** * Obtenez l'objet SerialTool qui fournit le service * @return serialTool * / public static serialTool getSerialTool () {if (serialTool == Null) {serialTool = new SerialTool (); } return serialTool; } / ** * Recherchez tous les ports disponibles * @return Liste des noms de port disponibles * / public static final arrayList <string> findport () {// Obtenez tous les ports de série actuellement disponibles en énumération <mandpportIdentifier> portlist = commportIdentifier.getPortIdentifiers (); ArrayList <string> portnameList = new ArrayList <> (); // Ajouter le nom de port série disponible pour répertorier et renvoyer la liste while (portlist.hasmoreElements ()) {String portname = portlist.nextelement (). GetName (); PortNameList.Add (PortName); } return PortNameList; } / ** * Ouvrir le port de série * @param PortName Port Nom * @param Baudrate Baudrate * @return Serialport Object * @throws serialportParameterFailure n'a pas réussi à définir les paramètres de port de série * @throws notaserialport Le port pointu sur le périphérique n'est pas le type de port * @throws nosuchport il n'y a pas Occuped * / public static final Serialport OpenPort (String Portname, int baudrate) lève SerialportParameterFailure, Notaserialport, Nosuchport, PortinUse {try {// identifier le port par le nom de port Commorditifier Portidentifier = CommorTridentifier.getportIdentifier (PortName); // Ouvrez le port et donnez le nom du port et un temps mort (temps de temps d'ouverture de l'ouverture) Commport Commport = PortIdentifier.Open (PortName, 2000); // Défendez-vous s'il s'agit du port série if (commport instanceof serialport) {serialport serialport = (serialport) commport; essayez {// définissez le taux de bauds et d'autres paramètres du port de série serialport.setserialportParams (baudrate, serialport.databits_8, serialport.stopbits_1, serialport.parity_none); } Catch (Uns-SupportdComMoperationException e) {Throw New SerialPortParAmEterFailure (); } //System.out.println("Open "+ Portname +" Successly! "); retour Serialport; } else {// pas de port série jet new notaserialport (); }} catch (NoSuchPortException E1) {Throw New Nosuchport (); } catch (PortinUseException e2) {Throw new PorttinUse (); }} / ** * Fermez le port de série * @param serialport L'objet de port série à fermer * / public static void roserport (serialport serialport) {if (serialport! = Null) {serialport.close (); serialport = null; }} / ** * Envoyez des données au port de série * @param serialport Serialport Object * @param Les données de commande à envoyer * @throws sendDatatoSerialportFailure ont échoué à envoyer des données au port de série * @throws serialportoutputStreamcloseFailefaile fermer l'erreur de flux de sortie de l'objet du port de série * / Public Static Vendi SendDatatoSerialPortFailure, serialportoutputStreamCloseFailure {outputStream out = null; try {out = serialport.getOutputStream (); out.write (ordre); out.flush (); } catch (ioException e) {lancez new SendDatatoSerialPortFailure (); } enfin {try {if (out! = null) {out.close (); out = null; }} catch (ioException e) {lancer un nouveau serialportoutputStreamCloseFailure (); }}}} / ** * Lire les données du port de série * @param serialport L'objet Serialport avec une connexion a été établi * @return Les données lues * @throws readdatafromSerialportFailure Une erreur s'est produite lors de la lecture des données du port de série * @throws serialportInputStreamCloseFailue ReadDataFromSerialPortFailure, serialportInputStreamCloseFailure {inputStream dans = null; octet [] octets = null; try {in = serialport.getInputStream (); int buffLenth = in.Available (); // Obtenez la longueur des données dans le tampon while (bufflenth! = 0) {bytes = new Byte [bufflenth]; // Initialisez le tableau d'octets à la longueur des données dans le tampon dans.read (octets); buffLenth = in.Available (); }} catch (ioException e) {lancer un nouveau ReadDataFromSerialPortFailure (); } enfin {try {if (in! = null) {in.close (); in = null; }} catch (ioException e) {lancer un nouveau serialportInputStreamCloseFailure (); }} return octets; } / ** * Ajouter l'écouteur * @param port de port de port * @param écouteur de port de série de série * @throws toomanyListeners Il y a trop d'objets de classe d'écoute * / public static void addListener (serialport port, serialportEventListener auditeur) lance ToomanyListeners {try {// add audiner port.addeventListener (auditeur); // défini pour réveiller le thread de réception d'écoute lorsque les données arrivent à port.NotifyondataAvailable (true); // défini pour réveiller le thread d'interruption lorsque la communication est interrompue Port.NotifyOnBreakInterrupt (true); } catch (ToomanyListenersException e) {Throw New ToomanyListeners (); }}}Remarque: les exceptions de lancer dans cette méthode sont toutes mes exceptions personnalisées. La raison en est de faciliter le traitement correspondant dans le programme principal. Voici une description de l'une des exceptions:
(Notez que toutes mes exceptions personnalisées sont placées dans le package SeriaException)
Package SeriaException; classe publique SerialportParameterFailure étend une exception {/ ** * * / private statique final long SerialVersionUID = 1l; public serialportParameterFailure () {} @Override String public toString () {return "set les paramètres du port série ont échoué! L'ouverture de l'opération du port série n'est pas terminée!"; }}J'ai réécrit sa méthode toString () pour chaque classe d'exception personnalisée, afin que le programme principal puisse imprimer le message d'erreur correspondant après avoir attrapé l'exception.
Il existe également une classe dans le package SeriaException qui extrait les informations d'erreur dans l'objet d'exception reçu et la convertit en une chaîne et la renvoie. Le code est le suivant:
Package SeriaException; Importer java.io.ioException; import java.io.printwriter; import java.io.stringwriter; / ** * responsable de l'extraction et de la conversion du message d'erreur dans l'exception passée en une chaîne; * @author zhong * * / classe publique exceptionwriter {/ ** * encapsuler le message d'erreur dans une exception dans une chaîne et renvoyer la chaîne * @param e contient l'exception d'erreur * @return Message d'erreur String * / public static static getErroRFromexception (exception e) {stringWriter sw = null; Printwriter pw = null; essayez {sw = new StringWriter (); pw = new PrintWriter (SW); E.PrintStackTrace (PW); return "/ r / n" + sw.toString () + "/ r / n"; } catch (exception e2) {return "Un message d'erreur n'a pas été obtenu, veuillez vérifier et réessayer!"; } enfin {try {if (pw! = null) {pw.close (); } if (sw! = null) {sw.close (); }} catch (ioException e1) {e1.printStackTrace (); }}}}Quatre:
L'utilisation de la classe de programme principale, Client.java contient l'adresse d'entrée du programme (méthode principale). Sa fonction est d'afficher une interface de bienvenue et d'appeler la classe DataView.java pour l'affichage de données de port série réel.
Le code client.java est le suivant:
Package Serialport; Importer java.awt.color; import java.awt.flowlayout; import java.awt.font; import java.awt.frame; importer java.awt.graphics; import java.awt.gridlayout; import java.awt.image; import java.awt.Label; import java.awt.panel; import java.awt.Label; import Java.awt.panel; import Java.awt.Label; importation java.awt.panel; java.awt.toolkit; importer java.awt.event.keyadapter; import java.awt.event.keyevent; import java.awt.evevent.windowadapter; import java.awt.event.windowevent; import javax.swing.joptionPane; import serialexepception.exceptionworwriter; / ** * @aUrOr ZOROROROR * / CLASSE PUBLIC Le client étend le cadre {/ ** * * / privé static final long SerialVersionUID = 1l; / ** * Largeur d'interface du programme * / public statique final intatic width = 800; / ** * Hauteur de l'interface du programme * / public static final int hauteur = 620; / ** * L'emplacement de l'interface du programme (coordonnées horizontales) * / public static final int loc_x = 200; / ** * l'emplacement de l'interface du programme (coordonnées horizontales) * / public static final int loc_y = 70; Couleur couleur = couleur blanc; Image hors écran = null; // Utilisé pour la double tampon // Définissez l'icône de la fenêtre (ici, j'ai personnalisé l'icône de l'icône de la fenêtre Windows, car je pense vraiment quelle petite icône de café n'est pas belle = =) Toolkit Toolkit = getToolkit (); Image icon = toolkit.getImage (client.class.getResource ("Computer.png")); // Hold Other Classes DataView dataView = new DataView (this); // classe d'interface principale (affichage du panneau principal des données de surveillance) / ** * Méthode principale * @param args // * / public static void main (String [] args) {new Client (). LaunchFrame (); } / ** * Afficher l'interface principale * / public void launchFrame () {this.setBounds (loc_x, loc_y, largeur, hauteur); // Définissez l'emplacement où le programme apparaît sur le bureau this.setTitle ("CDIO Project"); // Définit le titre du programme this.seticonImage (icône); this.setbackground (color.white); // Définit la couleur d'arrière-plan this.addwindowListener (new WindowAdapter () {// Ajouter l'écoute à la fenêtre public void windowClosing (windowEvent arg0) {//system.exit(0); // quitte le programme}}); this.addkeyListener (new KeyMonitor ()); // Ajouter l'écoute du clavier this.setResiSable (false); // La taille de la fenêtre ne peut pas être modifiée ce.SetVisible (true); // la fenêtre d'affichage Nouveau thread (new RepainTthread ()). Start (); // Le thread de repeinture} / ** * dessine divers éléments de composants de l'interface du programme * / public void peinture (graphiques g) {couleur c = g.getColor (); G.Setfont (New Font ("Microsoft Yahei", Font.Bold, 40)); g.setColor (color.black); G.Drawstring ("Bienvenue à utiliser le système de surveillance en temps réel de l'ordinateur supérieur", 45, 190); G.Setfont (New Font ("Microsoft Yahei", Font.italic, 26)); g.setColor (color.black); G.Drawstring ("Version: 1.0 Propulsé par: Zhonglei", 280, 260); G.Setfont (New Font ("Microsoft Yahei", Font.Bold, 30)); g.setColor (couleur); G.Drawstring ("―----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- Color.White;} / ** * Méthode de tampon double repensage de chaque élément de l'interface * / public Void Update (Graphics G) {if (offscreen == null) OFFScreen = this.CreateImage (Width, Height); Goffscreen.setColor (Color.White); GoffScreen.Fillrect (0, 0, largeur, hauteur); Canvas original} / * * La classe intérieure implémente la surveillance des événements du clavier * / classe privée KeyMonitor étend KeyAdapter {public void keyrelent (keyEvent e) {int keyCode = e.getKeyCode (); if (keycode == keyevent.vk_enter) {// Lorsque le moniteur entend que l'utilisateur frappe le clavier Entrée, exécutez le fonctionnement suivant setVisible (false); // masquer l'interface de bienvenue dataView.SetVisible (true); // affiche l'interface de surveillance dataView.DataFrame (); // Initialisez l'interface de surveillance}}} / * * Repaindre le thread (repeindre tous les 250 millisecondes) * / classe privée RepainTthread implémente Runnable {public void run () {while (true) {repeain (); essayez {thread.sleep (250); } catch (InterruptedException e) {// Créer une boîte de dialogue lorsqu'un fil de repeint lance une exception et affiche les détails d'exception String err = exceptionwriter.getErroRInfromexception (e); JOptionPane.showMessageDialog (null, err, "error", jOptionPane.information_Message); System.exit (0); }}}}}Capture d'écran en cours:
Remarque: le bas "Cliquez sur Entrer la touche pour entrer l'interface principale" dans le processus de fonctionnement réel a un effet flash (il est réalisé en réduisant l'interface de temps en temps, permettant à cette phrase d'apparaître à plusieurs reprises dans les couleurs blanches et noires). La méthode de double tampon est propice à la résolution du problème du scintillement de l'interface lors de la réévaluation (si vous n'utilisez pas la méthode de tampon à double, il équivaut à dessiner de nouvelles choses sur l'ancienne interface un peu à bit à chaque fois que vous rééchouez, et la double tampon est essentiellement en dessinant la première interface en mémoire, puis en couvrant directement l'ancienne interface avec la nouvelle interface à la fois)
Le code DataView.java est le suivant: (Cette classe est utilisée pour afficher les données du port série en temps réel)
Explication simple:
Le périphérique matériel envoie des données à l'ordinateur via le port série de temps en temps. Une fois que l'outil de port série est connecté avec succès au périphérique matériel et ajoute une surveillance, il analysera les données et mettra à jour l'interface chaque fois que les données sont reçues;
Vos exigences sont susceptibles d'être différentes des miennes lors de l'utilisation. Cette classe est pour référence uniquement. Dans une utilisation réelle, vous devrez peut-être recréer l'interface d'affichage des données et la méthode d'analyse des données.
Package Serialport; Importer java.awt.button; import java.awt.choice; import java.awt.color; import java.awt.font; import java.awt.frame; import java.awt.graphics; importation java.awt.toolkit; java.awt.event.actionEvent; import java.awt.event.actionListener; import java.awt.event.windowadapter; import java.awt.event.windowevent; import java.util.list; import java.util.toomanyListersException; import javax.swing.joptionpane; GNU.IO.SerialPortEvent; import gnu.io.serialportEventListener; Importer SeriaException. *; / ** * Surveillance Data Display class * @author zhong * * / public class dataView étend le cadre {/ ** * * / private static final SerialVersionUID = 1l; Client client = null; Liste privée <string> CommList = null; // Enregistrer les numéros de port disponibles privés serialport serialport = null; // Enregistrer l'objet de port série FONT PRIVÉE FONT = NOUVEAU FONT ("Microsoft Yahei", Font.Bold, 25); étiquette privée TEM = new Label ("pas encore de données", label.center); // Température Label privé HUM = nouveau label ("pas encore de données", Label.Center); // Humidity Private Label PA = nouveau label ("pas encore de données", label.center); // Pression private label rain = new Label ("pas encore de données", label.center); // Label privé des précipitations win_sp = new Label ("pas encore de données", label.center); // Étiquette privée de la vitesse du vent win_dir = new Label ("pas encore de données", label.center); // Wind Direction Private Choice CommCoice = new Choice (); // Sélection de port série (boîte déroulante) Private Choice bpsChoice = new Choice (); // bouton privé de sélection de taux de mauvais débit OpenSerialButton = nouveau ("ouvrir le port série"); Image hors écran = null; // Canvas Lorsque vous repeindre // définissez l'icône de la boîte à outils de fenêtre Toolkit = getToolkit (); Image icon = toolkit.getImage (dataView.class.getResource ("ordinateur.png")); / ** * Class Constructor * @param client * / public dataView (client client) {this.client = client; CommList = serialTool.Findport (); // Analyser le port série valide une fois lorsque le programme est initialisé} / ** * La fenêtre du menu principal s'affiche; * Ajouter une étiquette, un bouton, une barre déroulante et une écoute d'événement associée; * / public void dataFrame () {this.setBounds (client.loc_x, client.loc_y, client.width, client.height); this.setTitle ("CDIO Project"); this.seticonImage (icône); this.setbackground (color.white); this.setLayout (null); this.addwindowListener (new WindowAdapter () {public void windowclosing (windowEvent arg0) {if (serialport! = null) {// Fermer le port série lorsque le programme quitte et libère la ressource serialTool.closeport (serialport);} System.exit (0);}}); TEM.SetBounds (140, 103, 225, 50); Tem.setbackground (Color.Black); tem.setfont (font); tem.setForeground (Color.white); ajouter (TEM); Hum.setbounds (520, 103, 225, 50); Hum.setbackground (Color.Black); Hum.setfont (font); Hum.setForeground (Color.white); ajouter (bourdonner); PA.Setbounds (140, 193, 225, 50); PA.SetBackground (Color.Black); pa.setfont (police); pa.setForeground (Color.white); ajouter (pa); Rain.SetBounds (520, 193, 225, 50); Rain.SetBackground (Color.Black); rain.setfont (police); Rain.SetForeground (Color.white); ajouter (pluie); win_sp.setbounds (140, 283, 225, 50); win_sp.setbackground (Color.Black); win_sp.setfont (font); win_sp.setForeground (Color.white); ajouter (win_sp); win_dir.setbounds (520, 283, 225, 50); win_dir.setbackground (Color.Black); win_dir.setfont (font); win_dir.setForeground (Color.white); ajouter (win_dir); // Ajouter une option de sélection de port série CommCoice.SetBounds (160, 397, 200, 200); // Vérifiez s'il y a un port série disponible. If (CommList == null || commist.size () <1) {joptionpane.showMessageDialog (null, "Aucun port série valide n'a été trouvé!", "Error", joptionpane.information_message); } else {for (String s: Commlist) {CommChoice.add (s); }} add (CommCoice); // Ajouter une option de taux de bauds bpschoice.setbounds (526, 396, 200, 200); bpsChoice.add ("1200"); bpschoice.add ("2400"); bpschoice.add ("4800"); bpschoice.add ("9600"); bpschoice.add ("14400"); bpschoice.add ("19200"); bpschoice.add ("115200"); ajouter (bpsChoice); // Ajouter le bouton de port série ouvert OpenSerialButton.SetBounds (250, 490, 300, 50); OpenSerialButton.SetBackground (Color.lightgray); OpenSerialButton.Setfont (New Font ("Microsoft Yahei", Font.Bold, 20)); OpenSerialButton.SetForeground (Color.DarkGray); Add (OpenSerialButton); // ajouter l'événement à écouter le bouton de port série ouvert OpenSeRiaLButton.AddactionListener (new ActionListener () {public void ActionPerformed (ActionEvent e) {// Obtenez le nom de port de série String CommName = CommCoice.getSelectedItem (); // Obtenez le baud rate BpsStr = BpsChoice.getSelected = == NULL || JOPTIONPANE.SHOWMESSAGEDIALOG (NULL, "Le taux de mauvais est obtenu!", "Erreur", JOPTIONPANE.Information_Message); SerialTool.OpenPort (CommName, BPS); // Le moniteur est invité à une surveillance réussie joptionpane.showMessageDialog (null, "le moniteur est réussi, les données de surveillance seront affichées plus tard!", "Invite", joptionpane.information_message); } Catch (SerialPortParameterFailure | NotAserialport | Nosuchport | Portinuse | ToomanyListeners E1) {// Lorsqu'une erreur se produit, utilisez une boîte de dialogue pour inviter le message d'erreur spécifique joptionpane.showmessemsage); }}}}}}); this.setResiSable (false); Nouveau thread (new RepreintThread ()). start (); // Démarrez le thread de repeindre} / ** * DROIS L'élément de composant d'interface principale * / public void peinture (graphiques g) {couleur c = g.getColor (); g.setColor (color.black); g.setfont (nouvelle police ("Microsoft Yahei", Font.Bold, 25)); G.Drawstring ("Température:", 45, 130); g.setColor (color.black); g.setfont (nouvelle police ("Microsoft Yahei", Font.Bold, 25)); G.Drawstring ("Humidité:", 425, 130); g.setColor (color.black); g.setfont (nouvelle police ("Microsoft Yahei", Font.Bold, 25)); G.Drawstring ("Pression:", 45, 220); g.setColor (color.black); g.setfont (nouvelle police ("Microsoft Yahei", Font.Bold, 25)); G.Drawstring ("Rain:", 425, 220); g.setColor (color.black); g.setfont (nouvelle police ("Microsoft Yahei", Font.Bold, 25)); G.Drawstring ("Speed Wind:", 45, 310); g.setColor (color.black); g.setfont (nouvelle police ("Microsoft Yahei", Font.Bold, 25)); G.Drawstring ("Direction du vent:", 425, 310); g.setColor (colore.gray); G.Setfont (New Font ("Microsoft Yahei", Font.Bold, 20)); G.Drawstring ("Sélection de port série:", 45, 410); g.setColor (colore.gray); G.Setfont (New Font ("Microsoft Yahei", Font.Bold, 20)); G.Drawstring ("Bad Rate:", 425, 410); } / ** * Méthode de tampon double repeint chaque composant élément de l'interface * / public void Update (Graphics g) {if (offscreen == null) offscreen = this.createImage (client.width, client.height); Graphics GoffScreen = offScreen.getGraphics (); Couleur c = goffscreen.getColor (); Goffscreen.setColor (Color.white); goffscreen.fillrect (0, 0, client.width, client.height); // repeindre le canevas d'arrière-plan this.paint (goffscreen); // repeindre l'élément d'interface goffscreen.setColor (c); G.DrawImage (hors écran, 0, 0, null); // "pulvérisation" la toile nouvellement dessinée sur la toile d'origine} / * * repeindre le thread (repeindre tous les 30 millisecondes) * / la classe privée RepreintThread implémente Runnable {public void run () {while (true) {// Appelez la méthode de repeinture repent (); // Analyser le port série Commlist = SerialTool.Findport (); if (CommList! = null && commist.size ()> 0) {// Ajouter le port série disponible nouvellement numérisé pour (String S: Commlist) {// Le nom de port série existe-t-il déjà? La valeur par défaut initiale n'est pas existée (si elle existe dans Commlist mais n'existe pas dans CommCoice, elle sera nouvellement ajoutée) Boolean Commexist = false; pour (int i = 0; i <commchoice.getItemCount (); i ++) {if (s.equals (CommChoice.getItem (i))) {// Le nom de port série actuellement numérisé existe déjà dans le scan initial comExist = True; casser; }} if (comxist) {// Le nom de port série actuellement numérisé existe déjà dans le scan initial et entre directement dans la boucle suivante; } else {// s'il n'existe pas, ajoutez le nouveau nom de port série à la liste déroulante du port série disponible CommCoice.add (s); }} // Supprimez le port série déjà indisponible pour (int i = 0; i <CommChoice.getItemCount (); i ++) {// Le port série a expiré, la valeur par défaut initiale est invalide (existe dans CommCoice mais n'existe pas dans Commlist, il a expiré) Boolean CommNotexist = True; pour (String S: Commlist) {if (s.equals (CommChoice.getItem (i))) {Commnotexist = false; casser; }} if (Commnotexist) {//system.out.println("Remove "+ CommChoice.getItem (i)); CommChoice.Remove (i); } else {continue; }}} else {// Si la lish numérisée est vide, supprimez tous les ports série existants CommChoice.RemoveAll (); } essayez {Thread.Sleep (30); } catch (InterruptedException e) {String err = exceptionwriter.getErroInFromexception (e); JOptionPane.showMessageDialog (null, err, "error", jOptionPane.information_Message); System.exit (0); }}}}} / ** * Créez une classe d'écoute en série sous la forme d'une classe interne * @author zhong * * / classe privée SerialListener implémente SerialPortEventListener {/ ** * Gire les événements de port série surveillés * / SERIALPORTEVET.GETEVEVERT (SERIALPORTEVENT SERIALPORTEVENT) {Switch (SerialPortEvent.getEventy SerialportEvent.bi: // 10 Interruption de communication joptionpane.showMessageDialog (null, "Interruption de communication avec le périphérique série", "Error", joptionpane.information_message); casser; cas SerialportEvent.oe: // 7 Overflow (Overflow) Erreur case serialportEvent.fe: // 9 Frame Error Case SerialportEvent.pe: // 8 Parity Error Case SerialportEvent.cd: // 6 Cas de détection de transporteur SerialportEvent.CTS: // 3 CLEAR DATA DONNÉS À SEAL SERIALPORTEVENT.DSR: // 4 4 Les données sont envoyées le cas pour être SentialPortEvent. 5 La sonnerie indique que le cas serialportEvent.output_buffer_empty: // 2 Le tampon de sortie a été effacé; case serialportEvent.data_available: // 1 Les données disponibles existent sur le port série // System.out.println ("Données trouvées"); octet [] data = null; essayez {if (serialport == null) {jOptionPane.showMessageDialog (null, "L'objet de port série est vide! La surveillance a échoué!", "Erreur", joptionpane.information_message); } else {data = serialTool.readFromport (serialport); // Lisez les données et les stocker dans Byte Array // System.out.println (nouvelle chaîne (données)); //Customize the parsing process, you can parse the data after receiving the data according to your own needs during the actual use process if (data == null || data.length < 1) { //Check whether the data is read correctly JOptionPane.showMessageDialog(null, "No valid data was obtained during the reading of the data! Please check the device or program!", "Error", JOptionPane.information_Message); System.exit (0); } else {String dataoriginal = new String (data); // Convertir les données du tableau d'octets en une chaîne qui enregistre la chaîne de données d'origine dataValid = ""; // Données valides (utilisées pour enregistrer la chaîne de données d'origine et supprimer la chaîne après le numéro de début * Numéro) String [] Elements = NULL; // Utilisé pour enregistrer le tableau de chaîne obtenu après avoir divisé la chaîne d'origine par des espaces // analyser les données if (dataoriginal.charat (0) == '*') {// Lorsque le premier caractère des données est le * numéro, cela signifie que la réception des données est terminée et que le analyse de données de l'analyse DataValid = Dataoriginal.Substring (1); elements = datavalid.split (""); if (elements == null || elements.length <1) {// Vérifiez si les données sont analysées correctement joptionpane.showMessageDialog (null, "Le processus d'analyse de données a une erreur, veuillez vérifier l'appareil ou le programme!", "Erreur", joptionpane.information_message); System.exit (0); } else {try {// Mettez à jour la valeur de l'étiquette d'interface / * pour (int i = 0; i <elements.length; i ++) {System.out.println (elements [i]); } * / //System.out.println("win_dir: "+ elements [5]); tem.setText (éléments [0] + "℃"); Hum.setText (éléments [1] + "%"); PA.SETTEXT (Elements [2] + "HPA"); rain.setText (éléments [3] + "mm"); win_sp.setText (éléments [4] + "m / s"); win_dir.setText (éléments [5] + "°"); } catch (arrayIndexoutofBoundSexception e) {joptionpane.showMessageDialog (null, "Le processus d'analyse des données a une erreur, et les données d'interface de mise à jour ont échoué! Veuillez vérifier le périphérique ou le programme!", "Erreur", joptionpane.information_message); System.exit (0); }}}}}}} catch (ReadDataFromSerialPortFailure | SerialportInputStreamCloseFailure e) {joptionpane.showMessageAriAl (null, e, "error", joptionpane.information_message); System.exit (0); // quitte le système une fois le message d'erreur affiché lorsqu'une erreur de lecture se produit} Break; }}}}Capture d'écran en cours:
Téléchargez l'intégralité du code source du projet: http://xiazai.vevb.com/201612/yuanma/javaserialmonitor(vevb.com).rar
Ce qui précède est tout le contenu de cet article. J'espère que cela sera utile à l'apprentissage de tous et j'espère que tout le monde soutiendra davantage Wulin.com.