Cet article partage le code spécifique pour Java pour implémenter la communication série pour votre référence. Le contenu spécifique est le suivant
1. Introduction
Le programme de communication série mis en œuvre par Java prend en charge l'envoi et la réception de données hexadécimales.
Code source: SerialportDemo
Les rendus sont les suivants:
2.rxtxcomm
Java Serial Communication Dependency Jar Package RXTXCOMM.jar
Télécharger l'adresse: http://download.csdn.net/detail/kong_gu_you_lan/9611334
Comprend l'utilisation de la version 32 bits et 64 bits:
Copiez rxxxcomm.jar dans le répertoire java_home / jre / lib / ext;
Copiez RXTXSerial.dll dans le répertoire Java_Home / Jre / Bin;
Copier rxxxParallel.dll dans le répertoire Java_Home / Jre / Bin;
Java_Home est le chemin d'installation JDK
3. Gestion de la communication du port série
SerialportManager met en œuvre la gestion de la communication du port série, y compris la recherche de ports disponibles, l'ouverture et la fermeture du port série, et l'envoi et la réception de données.
Package com.yang.serialport.manage; import gnu.io.commport; import gnu.io.commportIdentifier; Import gnu.io.nosuchportException; import gnu.io.portInUseException; import gnu.io.serialport; java.io.ioException; import java.io.inputStream; import java.io.outputstream; import java.util.arraylist; import java.util.enumeration; import java.util.toomanylisersException; import com.yang.serialport.exception.nosuchport; import com.yang.serrialport.exception.notaserport; import; com.yang.serialport.exception.porttinuse; import com.yang.serialport.exception.readdatafromSerialportfailure; import com.yang.serialport.exception.sendDatatoSerialportFailure; import com.yang.serialport.exception.serialportStreamClosefailure; com.yang.serialport.exception.serialportoutputStreamclosefailure; import com.yang.serialport.exception.serialportParameterFailure; import com.yang.serialport.exception.toomanylisers; / ** * Gestion du port de série * * @Author Yangle * / Classe publique Serialportmanagor {/ ** * * TOUJOUR DISPOSITIQUE * / CLASSE PUBLICA Noms de port * / @SuppressWarnings ("Unchecked") public static final ArrayList <string> findport () {// Obtenez tous les ports de série actuellement disponibles énumération <molpportIdentifier> portlist = commptridentifier .getPortIdentifiers (); ArrayList <string> portnameList = new ArrayList <string> (); // Ajoutez le nom de port série disponible à la liste et renvoyez la liste while (portlist.hasmoreElements ()) {String portname = portlist.nextelement (). GetName (); PortNameList.Add (PortName); } return PortNameList; } / ** * Ouvrir le port de série * * @param portname * Nom du port * @param baudrate * baud rate * @return objet de port série * @throws serialportParameterFailure * a échoué pour définir les paramètres du port de série * @throws notaserialport * Port pointing de l'appareil n'est pas le port de port * @throws nosuchport * n'a pas de portment de port sérial. Occuped * / public static final Serialport OpenPort (String Portname, int baudrate) lève SerialportParameterFailure, Notaserialport, Nosuchport, PortinUse {try {// identifier le port par nom de port CommportIdentifier PortIdentifier = CommorTridentifier .getPortIdentifier (PortName); // Ouvrez le port, définissez le nom du port et le délai d'expiration (temps de temps d'ouverture de l'ouverture) Commport Commport = PortIdentifier.open (PortName, 2000); // Déterminez s'il s'agit d'un 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 (); } return serialport; } else {// pas le port de 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 * Objet de port série à fermer * / public static void roserport (serialport serialport) {if (serialport! = Null) {serialport.close (); serialport = null; }} / ** * Envoyer des données au port de série * * @param serialport * objet de port série * @param commande * Données à envoyer * @throws sendDatatoSerialportFailure * Échec des données au port de série * @throws serialportoutputStreamCloseFailure * Fermez l'erreur de streaming de sortie, l'ordre de l'Ordre du port sérial) lance SendDatatoSerialPortFailure, serialportOutStreamCloseFailure {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 la connexion actuellement établie * @return les données lues * @throws readDatafromSerialportFailure * Une erreur s'est produite pendant la lecture des données du port série * @throws serialportInputStreamCloseFailure * Une erreur s'est produite lors de la fermeture de l'objet SERAL ReadFromport (Serialport Serialport) lève ReadDataFromSerialportFailure, SerialportInputStreamCloseFailure {InputStream dans = null; octet [] octets = null; try {in = serialport.getInputStream (); // Obtenez la longueur de données int dans le tampon bufflenth = in.Available (); while (bufflenth! = 0) {// Initialisez le tableau d'octets à la longueur des données dans les bytes tampon = new byte [bufflenth]; in.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 * objet de port série * @param écouteur * écouteur de port série * @throws toomanyListeners * toomanyListeners * toomanyListener trop d'objets de classe d'écoute * / public static void addListener (serialport port, serialportEvent Listender) lance (écouteur); // Définissez le fil d'écoute de réécoute lorsque les données arrivent à port.NotifyDataAvailable (true); // Définissez le fil d'interruption de réveil lorsque la communication est interrompue port.NotifyOnBreakInterrupt (true); } catch (ToomanyListenersException e) {Throw New ToomanyListeners (); }}}4. Fenêtre principale du programme
/ * * Mainframe.java * * Créé sur 2016.8.19 * / package com.yang.serialport.ui; import gnu.io.serialport; import gnu.io.serialportEvent; import gnu.io.serialportEventlitener; import java.awt.color; import java.awt.graphicsenvionment; import java.point; import; java.awt.event.actionEvent; import java.awt.event.actionListener; import java.util.list; import javax.swing.borderfactory; importer javax.swing.jbutton; import javax.swing.jcombobox; import javax.swing.jframe; import javax.swing.jlabel; import javax.swing.jpanel; import javax.swing.jscrollpane; import javax.swing.jtextarea; import javax.swing.jtextfield; import com.yang.serialport.exception.nosuchport; import com.yang.serialport.exception.notasérialport; import com.yang.serialport.exception.portinuse; com.yang.serialport.exception.sendDatatoSerialportFailure; import com.yang.serialport.exception.serialportoutputStreamclosefailure; import com.yang.serialport.exception.toomanyisteterfaile; com.yang.serialport.manage.serialportManager; import com.yang.serialport.utils.byteutils; import com.yang.serialport.utils.showutils; / ** * Interface principale * * @Author Yangle * / public classe mainframe étend jframe {/ ** l'interface du programme width * / public static final intrawth = 500; / ** * Hauteur de l'interface du programme * / public static final int hauteur = 360; private jTextArea dataView = new JTextArea (); JSCROLLPANE privé ScrollDataview = new JSCrollPane (DataView); // Panneau de paramètres de port série privé jpanel serialportpanel = new JPanel (); JLABEL privé SerialPortLabel = new JLabel ("Port série"); JLABEL privé BaudrateLabel = new JLabel ("baudrate"); JCOMBOBOX privé CommCoice = new JComboBox (); JCOMBOBOX privé BaudrateChoice = new JComboBox (); // Panneau d'opération Private JPanel OperatePanel = new JPanel (); private jTextfield datainput = new JTextField (); privé jbutton serialportOperate = new Jbutton ("port de série ouvert"); privé jbutton sendData = new JButton ("Envoyer des données"); Liste privée <string> CommList = null; Serialport privé Serialport; public mainframe () {initView (); INITCOMPONENTS (); actionListener (); initdata (); } private void initView () {// Fermez le programme setDefaultCloseOperation (javax.swing.windowconstants.exit_on_close); // interdire la maximisation des fenêtres setResizable (false); // Définissez la fenêtre du programme sur le point central p = graphicsSenvironment.getLocalGraphicSenIironment () .getCenterPoint (); SETBOUNDS (PX - Largeur / 2, py - hauteur / 2, largeur, hauteur); this.setLayout (null); Setttitle ("communication série"); } private void initComponents () {// Data affiche dataView.setFocUsable (false); ScrollDataview.SetBounds (10, 10, 475, 200); add (scrollDataview); // serialportpanel.setborder (borderfactory.CreateTiTledBorder ("SerialportSet")); SerialportPanel.setbounds (10, 220, 170, 100); serialportpanel.setLayout (null); Add (SerialPortPanel); serialportLabel.setForeground (Color.Gray); serialportLabel.setbounds (10, 25, 40, 20); serialportpanel.add (SerialportLabel); CommCoice.setFocusable (false); CommCoice.setbounds (60, 25, 100, 20); serialportpanel.add (CommCoice); BaudrateLabel.setForeground (Color.Gray); BaudrateLabel.SetBounds (10, 60, 40, 20); serialportpanel.add (BaudrateLabel); baudratechoice.setFocusable (false); baudratechoice.setbounds (60, 60, 100, 20); serialportpanel.add (baudratechoice); // Opération OperatePanel.SetBounds (200, 220, 285, 100); OperatePanel.SetLayout (null); Add (OperatePanel); datainput.setbounds (25, 25, 235, 20); operatePanel.add (datainput); serialportOperate.setFocusable (false); SerialportOperate.setbounds (45, 60, 90, 20); OperatePanel.Add (SerialportOperate); sendData.setFocUsable (false); sendData.setBounds (155, 60, 90, 20); OperatePanel.add (SendData); } @SuppressWarnings ("Unchecked") private void initData () {CommList = serialportManager.Findport (); // Vérifiez s'il y a un port série, ajoutez-le à l'option if (Commlist == null || commist.size () <1) {showutils.warningMessage ("Aucun port série valide n'a été trouvé!"); } else {for (String s: Commlist) {CommChoice.Additem (s); }} baudratechoice.additem ("9600"); baudratechoice.additem ("19200"); baudratechoice.additem ("38400"); baudratechoice.additem ("57600"); baudratechoice.additem ("115200"); } private void ActionListener () {serialportOperate.AddactionListener (new ActionListener () {@Override public void ActionPerformed (ActionEvent e) {if ("Open Serial Port" .Equals (serialportaterate.gettex sendData.AddActionListener (new ActionListener () {@Override public void ActionPerformed (ActionEvent e) {sendData (e);}}); } / ** * Ouvrir le port de série * * @param evt * cliquez sur l'événement * / private void openSerialport (java.awt.event.actionEvent evt) {// Obtenez le port de série String Commname = (String) CommChoice.getSelectedItem (); // obtient le taux de bauds int baudrate = 9600; String bps = (String) baudrateChoice.getSelectedItem (); Baudrate = Integer.ParseInt (bps); // Vérifiez si le nom du port série est correct si (Commname == null || commname.equals ("")) {showutils.warningMessage ("Aucun port de série valide n'a été trouvé!"); } else {try {serialport = serialportManager.Openport (Commname, baudrate); if (serialport! = null) {dataView.setText ("Serialport est activé" + "/ r / n"); serialportOperate.seTText ("Close Serialport"); }} catch (serialportParameterFailure e) {e.printStackTrace (); } catch (Nosuchport e) {e.printStackTrace (); } catch (portinuse e) {e.printStackTrace (); Showutils.warningMessage ("Le port série a été occupé!"); }} essayez {serialportManager.AddListener (Serialport, new SerialListener ()); } catch (toomanyListeners e) {e.printStackTrace (); }} / ** * Fermez le port de série * * @param evt * cliquez sur l'événement * / private void closeSeSerialport (java.awt.event.actionEvent evt) {serialportManager.closeport (serialport); dataView.SeTText ("Le port série est fermé" + "/ r / n"); serialportOperate.seTText ("port de série ouvert"); } / ** * Envoyer des données * * @param evt * cliquez sur l'événement * / private void sendData (java.awt.event.actionEvent evt) {// Entrez les caractères hexadécimaux directement dans la zone d'entrée, la longueur doit être même des données de chaîne = dataNut.getText (). ToString (); try {SerialportManager.SendToport (serialport, byteutils.hexstr2byte (data)); } catch (sendDatatoSerialPortFailure e) {e.printStackTrace (); } catch (serialportoutputStreamCloseFailure e) {e.printStackTrace (); }} classe privée SerialListener implémente SerialportEventListener {/ ** * Gire les événements de port série surveillés * / public void Serialevent (SerialPortEvent SerialPortEvent) {Switch (serialportEvent.getEventype ()) {case serialportEvent.bi: // 10 Interrupt de communication shrowutiles.errorMessage ("" Interrupt de communication avec le dispositif de série "); casser; cas SerialportEvent.oe: // 7 Overflow (Overflow) Erreur Case SerialportEvent.Fe: // 9 Frame Erreur de cadre SerialportEvent.pe: // 8 Parity Error Case SerialportEvent.cd: // 6 Cas de détection de transporteur SerialportEvent.CTS: // 3 CLEAR DATA DONNÉS À SEALLEPORTEVENT.DDSR: // 4 Les données sont envoyées par le cas SERIALPORT. Indication case 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 octet [] data = null; essayez {if (serialport == null) {showutils.errorMessage ("L'objet de port série est vide! La surveillance a échoué!"); } else {// Read Serial Port Data Data = SerialportManager.ReadFromport (Serialport); DataView.APPEND (ByteUtils.ByteArraytoHexString (Data, True) + "/ R / N"); }} catch (exception e) {showutils.errorMessage (e.toString ()); // quitte le système après avoir affiché une erreur lorsqu'une erreur de lecture se produit System.exit (0); } casser; }}} public static void main (String args []) {java.awt.eventqueue.invokelater (new Runnable () {public void run () {new MainFrame (). setVisible (true);}}); }}5. Écrit à la fin
Adresse de téléchargement du code source: SerialportDemo
Les étudiants sont invités à se plaindre et à commenter. Si vous pensez que ce blog vous est utile, laissez un message ou donnez-lui un commentaire (^-^)
Merci: rédiger des outils de communication en série basés sur Java
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.