comunicacion-serial-en-java-jonathanmelgoza

Comunicacion serial en Java

Hoy vamos a mostrarte como trabajar con comunicacion serial en Java de manera fácil y rápida, uno de los temas básicos de java mas solicitados tanto en proyectos escolares como en temas mas avanzados. Hoy disponiéndome a realizar un proyecto de envió de sms desde un aplicación en java me veo obligado a hacer una rápida parada en comunicacion serial en java así que me he decidido a hacer este post y explicar paso a paso los archivos necesarios y la configuración correcta para poder realizar esta comunicación a puertos com en nuestra computadora, sin mas que decir de introducción vamos ya..

Configurando el ambiente

Lo primero que necesitamos para comenzar nuestro proyecto de comunicacion serial en java son estos 3 archivos:

  • comm.jar
  • win32comm.dll
  • javax.comm.properties

Todos estos archivos los puedes descargar desde mi paquete utils para sms desde java.

Una vez descomprimida la carpeta deberas colocar cada archivo en una locacion particular de tu computadora.

%JAVA_HOME% -> Directorio de instalacion del jdk de java. Por ejemplo «C:\Program Files (x86)\Java\jdk1.7.0_71»

comm.jar

%JAVA_HOME%/lib

%JAVA_HOME%/jre/lib/ext

win32comm.dll

%JAVA_HOME%/bin

%JAVA_HOME%/jre/bin

C:/windows/system32/

javax.comm.properties

%JAVA_HOME%/lib

%JAVA_HOME%/jre/lib

Una vez ubicados estos archivos en su respectiva ubicación deberemos tener iniciado ya nuestro proyecto para poder agregar la librería comm.jar al mismo.

En Netbeans vamos a Tools -> Libraries -> New Library -> Colocamos un nombre, por ejemplo «java serial» -> Add Jar/Folder -> Seleccionamos el jar comm.jar (esta en los archivos necesarios que descargaste) -> OK

Ahora una vez creada nuestra librería la agregamos dando click derecho sobre Libraries en nuestro proyecto y a continuación en Add Library, solo seleccionamos la librería que acabamos de crear y listo.

Abriendo el puerto y configurando opciones

Buscando puertos disponibles

Conectando a un puerto com

 Configurando ese puerto

Preparar el puerto para escribir y leer hacia y desde el

 Registramos el listener

Recordando que nuestra clase implemente el metodo SerialPortEventListener

 

Mandar y recibir informacion hacia y desde el puerto serial

Mandamos informacion al puerto mediante writeData

y leemos información recibida con la implementacion del método SerialEvent

Desconectamos el puerto con

Ahora solo desde donde queramos comenzar a escribir ..

Espero te sirva este código para realizar la comunicacion serial en java para tus proyectos y si te quedaste con ganas del proyecto de envió de sms desde java ya pronto lo publicare.

¿Quieres aprender mas? Compra en amazon el libro Java Como Programar a un precio economico.

Hasta Luego!

Comunicacion serial en Java

Clic para valorar esta información
[Total: 0 Promedio: 0]

29 comentarios en “Comunicacion serial en Java”

  1. Hola QUe tal tengo una duda me da un error en el initlistener.

    public void initListener() {
    try {
    serialPort.addEventListener(this);
    serialPort.notifyOnDataAvailable(true);
    System.out.println(«Listo..»);
    } catch (TooManyListenersException e) {
    System.out.println(«Demasiados escuchas.»);
    }
    me marca error en el (this).
    no se a que se deba te agradeceria mucho tu apoyo en este proyecto.

    Responder
  2. Hola, tengo una duda como seria para leer la respuesta, es decir como llamar la función para serialEvent(SerialPortEvent spe)

    gracias

    Responder
  3. Buenos dias, actualmente tengo un programa que lee el puerto pero tengo una duda en estos manejos de leer puertos que es mejor realizar un ciclo para que pueda ver lo que envia el ciclo, o el serial.event lo hace de manera mas efectiva, dado que en ocasiones no alcanzo a leer lo que llega, espero me puedas recomendar la maejor opcion

    Responder
    • Que tal!, como estas? es probable que no tengas conectados puertos comm a tu computadora y no tiene registrados en «registry key»

  4. Disculpen mi ignorancia…
    En donde esta el archivo «Send Sms Java» que se define en la linea: commPort = selectedPortIdentifier.open(«Send Sms Java», TIMEOUT);
    Pregunto si es que tengo que crear un archivo con ese nombre o se crearia solo, considerando que estoy en SO Windows

    Responder
  5. Hola saludos como estan.
    me ha servido de gran ayuda este tema.
    sin embargo luego de realizar varias pruebas desde mi ambiente de desarrollo todo funciona super, pero cuando compilo la pequeña aplicación con un .jar, me falla mostrando que falla al abrir puerto.

    Mil gracias por su colaboracion y ayuda.

    Responder
  6. Hola saludos como estan.
    me ha servido de gran ayuda este tema.
    sin embargo luego de realizar varias pruebas desde mi ambiente de desarrollo todo funciona super, pero cuando compilo la pequeña aplicación con un .jar, me falla mostrando que falla al abrir puerto.

    Responder
  7. Hola muy interesante esta publicación, espero me sirva estoy empezando un proyecto donde quiero leer los datos de una bascula conectada a la PC por puerto serial y almacenarlos en una BD creo que esto me debe ayudar, si pudieras darme un enfoque o darme tu opinión.
    Gracias de antemano!

    Responder
  8. Saludos a todos.

    Felicitaciones por el tutorial!!

    Queria comentarles que el problema del win32comm lo solucione intalando el jdk x86 (version 32bit).

    Pasos luego de instalar el jdk x86:

    1. Ubicar los respectivos archivos en las respectivas carpetas: C:\Program Files (x86)\Java\jdk1.8.0_77

    Copy ‘win32com.dll’ to JDK_HOME\jre\bin.
    Copy ‘javax.comm.properties’to to JDK_HOME\jre\lib.
    Copy ‘comm.jar’to to JDK_HOME\jre\lib\ext.

    2. Habilitar el JDK para x86 en la aplicacion:

    1.Posicionarse en la carpeta libraries del proyecto
    2. click derecho en el jdk actual (x64 )
    3. edit
    4. Add Plataform
    5. Buscamos la siguiente direccion del jdk x86: C:\Program Files (x86)\Java\jdk1.8.0_77

    Listo de esta forma se soluciona el error de: win32bit a 64bit no compatibles.

    Espero que les sea de gran ayuda

    Responder
  9. Hola, ¿cómo se podría implementar el método de «Lectura_del_puerto» desde una clase principal? Es decir, si creo un objeto, por ejemplo, «serial» y quiero implementar el método mencionado e igualarlo a una variable «int numBytes2», ¿se podría declarar int numBytes = serial.Lectura_del_puerto(); ? y así usar esa variable para realizar algo dado el valor que llega por el puerto.

    Responder
  10. Hola! Excelente post.
    Solo que me da el error de los 32 – 64 bits. Las librerias descargadas son de 32 bits y necesito las de 64, de donde puedo obtenerlas??? Por favor si alguien puede pasarmelas, es urgente.

    Muchas gracias desde ya. Saludos

    Responder
  11. Excelente post!!!!!!!!!!!! me funciono, talvez sea muy tarde pero al que tuvo este error—- Error loading win32com: java.lang.UnsatisfiedLinkError: C:\Program Files\Java\jdk1.8.0_45\jre\bin\win32com.dll: Can’t load IA 32-bit .dll on a AMD 64-bit platform, pues el error te dice que las librerias que estas usando son para 32 bits y tienes que descargar las librerias de 64 bits que solo son las RXTX. El que tenga problemas con las librerias puede enviarme un mail y yo le facilitare las librerias con las que me funcionaron(no posteo el link de descarga porque ya no me acuerdo de donde la descargue XD, es que descargue muchas pues a mi tambien me dio ese error) este es mi correo anzar.steve@gmail.com.
    Y Jonathan muchisimas gracias, sigue adelante.

    Mas Información en: http://jonathanmelgoza.com/blog/comunicacion-serial-en-java/#ixzz3y8Q0FjZX

    Responder
  12. Amigo tengo este error cuando ejecuto la comunicación serial

    Error loading win32com: java.lang.UnsatisfiedLinkError: C:\Program Files\Java\jdk1.8.0_45\jre\bin\win32com.dll: Can’t load IA 32-bit .dll on a AMD 64-bit platform

    Si sabes como puedo solucionarlo te agradecería mucho

    Responder
  13. Disculpa crees que me pudieras pasar el proyecto es que la verdad me están saliendo muchos errores que no entiendo por que salen y no se cuales son los import lo que se necesitan

    Responder
    • buen articulo para los que les marca error aqui esta el codigo

      import java.awt.event.KeyEvent;
      import java.io.IOException;
      import java.io.InputStream;
      import java.io.OutputStream;
      import java.security.Policy.Parameters;
      import java.util.Enumeration;
      import java.util.HashMap;
      import java.util.List;
      import java.util.TooManyListenersException;
      import javax.comm.CommPort;
      import javax.comm.CommPortIdentifier;
      import javax.comm.PortInUseException;
      import javax.comm.SerialPort;
      import javax.comm.SerialPortEvent;
      import javax.comm.SerialPortEventListener;
      import javax.comm.UnsupportedCommOperationException;
      import org.omg.CORBA.TIMEOUT;

      public class puertoCom implements SerialPortEventListener {

      Enumeration ports;
      HashMap portMap = new HashMap();

      public void searchForPorts() {
      System.out.println(«Puertos Disponibles:»);
      ports = CommPortIdentifier.getPortIdentifiers();
      while (ports.hasMoreElements()) {
      CommPortIdentifier curPort = (CommPortIdentifier) ports.nextElement();

      if (curPort.getPortType() == CommPortIdentifier.PORT_SERIAL) {
      System.out.println(curPort.getName());
      portMap.put(curPort.getName(), curPort);
      }
      }
      System.out.println(«———————-«);
      }

      CommPortIdentifier selectedPortIdentifier;
      SerialPort serialPort;
      boolean connected;

      public void connect() {
      String puerto = «COM8»;
      selectedPortIdentifier = (CommPortIdentifier) portMap.get(puerto);

      CommPort commPort = null;

      try {
      commPort = selectedPortIdentifier.open(«Send Sms Java», 100);
      serialPort = (SerialPort) commPort;
      setSerialPortParameters();
      connected = true;

      System.out.println(«conectado exitosamente a puerto » + puerto);
      } catch (PortInUseException e) {
      System.out.println(«Puerto en uso.»);
      } catch (Exception e) {
      System.out.println(«Error al abrir puerto.»);
      }
      }

      private void setSerialPortParameters() throws IOException {
      int baudRate = 115200;

      try {
      serialPort.setSerialPortParams(baudRate,
      SerialPort.DATABITS_8,
      SerialPort.STOPBITS_1,
      SerialPort.PARITY_NONE);

      serialPort.setFlowControlMode(
      SerialPort.FLOWCONTROL_NONE);
      } catch (UnsupportedCommOperationException ex) {
      throw new IOException(«Unsupported serial port parameter»);
      }
      }

      InputStream input;
      OutputStream output;

      public boolean initIOStream() {
      boolean successful = false;

      try {
      //
      input = serialPort.getInputStream();
      output = serialPort.getOutputStream();
      writeData(«HELLO»);

      successful = true;
      return successful;
      } catch (IOException e) {
      System.out.println(«Error al abrir Stream.»);
      return successful;
      }
      }

      public void initListener() {
      try {
      serialPort.addEventListener(this);
      serialPort.notifyOnDataAvailable(true);
      System.out.println(«Listo..»);
      } catch (TooManyListenersException e) {
      System.out.println(«Demasiados escuchas.»);
      }
      }

      public void writeData(String aenviar) {
      try {
      output.write(aenviar.getBytes());
      } catch (IOException ex) {
      System.out.println(«Error al enviar informacion.»);
      }
      }

      @Override
      public void serialEvent(SerialPortEvent spe) {
      if (spe.getEventType() == SerialPortEvent.DATA_AVAILABLE) {
      byte[] readBuffer = new byte[20];

      try {
      while (input.available() > 0) {
      int numBytes = input.read(readBuffer);
      }
      System.out.print(new String(readBuffer));
      } catch (IOException e) {
      System.out.println(e);
      }
      }
      }

      public void disconnect() {
      try {
      writeData(«GOODBYE»);

      serialPort.removeEventListener();
      serialPort.close();
      input.close();
      output.close();
      connected = false;

      System.out.println(«Desconectado.»);
      } catch (Exception e) {
      System.out.println(«Error al desconectar.»);

      }
      }

      public static void main(String[] args) throws Exception {
      puertoCom obj = new puertoCom();
      obj.searchForPorts();

      obj.connect();
      if (obj.connected == true) {
      if (obj.initIOStream() == true) {
      obj.initListener();

      obj.writeData(«comandos a puerto serial»);

      }
      }
      }
      }

  14. Hola primero, quiero felicitarte por tu blog, esta buenísimo, y después preguntar ¿por qué será que en el primer método public void searchForPorts() me marca error en portMap? no he podido probar el código por ese primer error.

    Responder
    • Gracias Jonathan, pero como no encontraba el porque del error tuve que implementarlo de forma diferente:

      public void searchForPorts() {

      Enumeration listaPuertos = CommPortIdentifier.getPortIdentifiers();
      CommPortIdentifier idPuerto = null;
      boolean encontrado = false;
      while (listaPuertos.hasMoreElements() && !encontrado) {
      idPuerto = (CommPortIdentifier) listaPuertos.nextElement();
      if (idPuerto.getPortType() == CommPortIdentifier.PORT_SERIAL) {
      System.out.println(idPuerto.getName());
      if (idPuerto.getName().equals(«COM23»)) {
      encontrado = true;
      }
      }
      }

      SerialPort puertoSerie = null;
      try {
      puertoSerie = (SerialPort) idPuerto.open(«DescripcionPropietario»,
      2000);
      System.out.println(«Se abrio exitasamente»);

      } catch (PortInUseException e) {
      System.out.println(«Error abriendo el puerto serie»);
      }

      Pero aún así lo voy a probar con el HashMap()

      Gracias, saludos!

    • Hola Jonathan, estoy retomando el tema y quiero utilizar tus métodos pues definitivamente se me hace muy práctico, inicialice HashMap portMap = new HashMap(); en el primer método searchForPorts() y funciona de maravilla, pero ahora el problema lo tengo en el segundo método connect(); ya que de igual manera me marca error en el portMap, lo incializo y desaparece el error pero al ejecutarlo no es capaz de abrir el puerto, la pregunta es ¿Necesito el valor del portMap del método searchForPorts(); para que pueda abrir el puerto en connect(); y de ser así como puedo obtener ese valor.

      De antemano muchas gracias por tu apoyo.
      Saludos 🙂

Deja un comentario