Communiquez avec le port Serial en Java

Prérequis :

  • Un IDE java, dans mon cas j’utilise Netbeans, télécharger ici.
  • Une librairie nommée javax.comm, téléchargeable ici                              (le mot de passe est : javax.comm)
  • Un JDK (Java Développement Kit) en x86 (32bits pour assurer la compatibilité avec la librairie SerialComm, télécharger ici.
  • Une carte Arduino doté d’au moins 1 capteur.

Préparation de l’ IDE pour le développement : 

-Création du projet de catégorie java et comme type de projet : Java Application.

-Importation de la librairie SerialComm :

  • 1. Copier le « [ comm.jar ] » dans :

%JAVA_HOME%/lib

%JAVA_HOME%/jre/lib/ext

  • 2. Copier  » [ win32com.dll ]  » dans :

%JAVA_HOME%/bin

%JAVA_HOME%/jre/bin

%windir%System32

  • 3. Copier le » [ javax.comm.properties ]  » dans :

%JAVA_HOME%/lib

%JAVA_HOME%/jre/lib

  • 4.Installation dans l’IDE :

Projet clic droit => Properties => Libraries

Sélectionnez le JDK en 32 bits pour ne pas avoir de problème plus tard.

Puis Add JAR/Folder :

Début de la programmation :

Afin d’importez votre librairie javax.comm indiquez en haut du code l’importation comme ceci :

import javax.comm.*;

Maintenant clic droit sur le package et new jFrame form… appelez le Reception.

  • Ajoutez un nouveau Button (jButton) et renommez le en : Recherche des ports comme ceci  :

  • Ajoutez une Combo Box et clic droit => propriété => enlevez les item1,2,3,4 dans modelItem 1, Item 2, Item 3, Item 4 en , , ,

  • Ajoutez une zone de texte (Text Area)
  • Ajoutez un nouveau Button appelé « Deconnexion »

  • Double cliquez sur « Recherche des ports » et ajoutez le code suivant:
     java.util.Enumeration<CommPortIdentifier> portEnum = CommPortIdentifier.getPortIdentifiers();
     int i = 0;
     String[] r = new String[5];
 
     while (portEnum.hasMoreElements() && i < 5){
        CommPortIdentifier portIdentifier = portEnum.nextElement();
        r[i] = portIdentifier.getName();
 
        i++;
     }

Il se peut que CommPortIdentifier fasse une erreur, sélectionnez le, faite ALT + ENTREE et Import.

  • Ajoutez les implements Runnable, SerialPortEventListener à la définition de classe et les attributs et import (tout en haut du code source de Reception)  votre code doit être à l’identique de celui-ci :
import java.util.Enumeration;
import javax.comm.CommPortIdentifier;
import javax.comm.SerialPort;
import javax.comm.SerialPortEventListener;


public class Reception extends javax.swing.JFrame implements Runnable, SerialPortEventListener {

 static CommPortIdentifier portId;
 static Enumeration portList;
 InputStream inputStream;
 SerialPort serialPort;
 Thread readThreads;
  • Retournez dans l’onglet design et faite un double clic sur la comboBox :

Et ajoutez le code suivant dans la méthode d’action  :

 Object selectedItem = jComboBox1.getSelectedItem();
 
 String com = selectedItem.toString();
 SimpleRead(com);
  • Maintenant double-cliquez sur « Deconnexion » et ajouter ce code :
serialPort.close();
  • Rendez vous à cet endroit précis en bas du code et en haut des déclarations variables, ici  :

 

 

 

 

 

Et y ajouter le code suivant :

 public void SimpleRead(String com) {
    portList = CommPortIdentifier.getPortIdentifiers();

    while (portList.hasMoreElements()) {
       portId = (CommPortIdentifier) portList.nextElement();
       if (portId.getPortType() == CommPortIdentifier.PORT_SERIAL) {
           if (portId.getName().equals(com)) {
               // if (portId.getName().equals("/dev/term/a")) {
               try {
                   serialPort = (SerialPort) portId.open("SimpleReadApp", 2000);
               } catch (PortInUseException e) {
                   System.out.println(e);
               }
               try {
                   inputStream = serialPort.getInputStream();
               } catch (IOException e) {
                   System.out.println(e);
               }
               try {
                   serialPort.addEventListener(this);
               } catch (TooManyListenersException e) {
               System.out.println(e);
               }
               serialPort.notifyOnDataAvailable(true);
               try {
                   serialPort.setSerialPortParams(9600,
                           SerialPort.DATABITS_8,
                           SerialPort.STOPBITS_1,
                           SerialPort.PARITY_NONE);
               } catch (UnsupportedCommOperationException e) {
                   System.out.println(e);
               }
               readThread = new Thread(this);
               readThread.start();
           }
       }
   }
}

 public void run() {
    try {
        Thread.sleep(20000);
    } catch (InterruptedException e) {
        System.out.println(e);
    }
 }

 public void serialEvent(SerialPortEvent event) {
 switch (event.getEventType()) {
     case SerialPortEvent.BI:
     case SerialPortEvent.OE:
     case SerialPortEvent.FE:
     case SerialPortEvent.PE:
     case SerialPortEvent.CD:
     case SerialPortEvent.CTS:
     case SerialPortEvent.DSR:
     case SerialPortEvent.RI:
     case SerialPortEvent.OUTPUT_BUFFER_EMPTY:
         break;
     case SerialPortEvent.DATA_AVAILABLE:
        byte[] readBuffer = new byte[12];

        try {
           while (inputStream.available() > 0) {
           //int numBytes = inputStream.read(readBuffer);
           inputStream.read(readBuffer);
           }

           String y = new String(readBuffer);
           System.out.print(new String(readBuffer));
           jTextArea1.setText(" " + y + " ");
           waiting(1);
       } catch (IOException e) {
           System.out.println(e);
       }
       break;
    }
 }


 public static void waiting(int n) {

    long t0, t1;

    t0 = System.currentTimeMillis();

    do {
        t1 = System.currentTimeMillis();
    } while ((t1 - t0) < (n * 1000));
 }
  • Ajout de la classe Reception en tant que classe principal (main)

Clic droit sur le projet, properties, run

  • Vous pouvez maintenant compiler votre programme, menu run, clean and build project (MAJ+F11)