El puerto de comunicaciones RS232, mejor conocido como puerto serial es un puerto un tanto limitado en cuanto a capacidades ya que la velocidad a la que trabaja y la distancia máxima que puede manejar son muy bajas, sin embargo , actualmente todavía existen muchos dispositivos que se conectan a través de esta interfaz, desde impresoras de tickets hasta lectores de códigos de barras.
Debido a ello, es importante conocer la forma de manejar dicho puerto con Java. A continuación, explicaré y redactaré un ejemplo básico y sencillo utilizando un lector de código de barras para la lectura de los datos provenientes de él por medio del puerto serial.
Librerías:::
Java provee de una librería para el manejo de comunicaciones a través de puertos como el serial y paralelo (la librería comm), sin embargo, el uso e implementación de esta librería está enfocado para sistemas Linux y Solaris, y su configuración en Windows es un tanto complicada, normalmente al ejecutar un programa que utilice dicha librería bajo Windows obtendremos una excepción como la siguiente:
Error loading SolarisSerial: java.lang.UnsatisfiedLinkError: no SolarisSerialParallel in java.library.path
Caught java.lang.UnsatisfiedLinkError: com.sun.comm.SolarisDriver.readRegistrySerial(Ljava/util/Vector;Ljava/lang/String;)I while loading driver com.sun.comm.SolarisDriver
Para evitar complicaciones en la configuración y errores como el anterior, utilizaremos una librería alternativa de nombre GiovynetSerialPort, dicha librería provee de métodos para enviar y recibir datos a través de los puertos serial y paralelo. Así que lo primero que debes hacer es descargarla del siguiente link:
http://code.google.com/p/giovynetserialport/downloads/list
Una vez que la hayas descargado, descomprime el archivo y copia la librería SerialPort.jar dentro de tu carpeta c:\Archivos de programa\Java\jdkxxx\jre\lib\ext para tener los métodos disponibles al momento de crear las clases que interactuarán con los puertos de comunicación.
El proyecto:::
Hecho esto creamos un nuevo proyecto en NetBeans y le damos el nombre que queramos, puede ser EjemploPuertoSerie o algo por el estilo.
Dentro del proyecto, en la clase main agregamos las siguientes variables a nivel de clase:
static SerialPort puerto = new SerialPort();
static List<String> listaPuertos;
static Com com1;
donde:
SerialPort: es un objeto del tipo de puerto que vamos a utilizar.
listaPuertos: es la lista que contendrá los puertos libres que existen actualmente.
com1: es la interface que se estará manejando para el control del dispositivo.
Las variables son declaradas estáticas debido a que vamos a utilizarlas dentro del método main, en caso de que desees utilizarlas en otro lugar de tu aplicación no es necesario que estén declaradas de esa manera.
Posteriormente, dentro del método main, vamos a obtener la lista de los puertos disponibles, para ello, escribimos la siguiente línea de código:
listaPuertos = puerto.getFreeSerialPort();
y posteriormente declaramos una variable tipo String que contendrá todos aquellos datos leídos desde el puerto serie y otra que contendrá el último caracter leído…
String recibido = “”;
String caracter = “”;
Si deseamos verificar cuáles puertos están disponibles creamos un ciclo que los imprima…
for (String string : listaPuertos) {
System.out.println(string);
}
…ahora estableceremos las propiedades que sean necesarias para poder trabajar con el puerto, en mi caso necesito manejar 9600 bits por segundo a través del COM1…
Parameters settings = new Parameters();
settings.setPort("COM1");
settings.setBaudRate("9600");
…y en base a los parámetros establecidos creamos una instancia del objeto tipo interfaz de comunicación…
com1 = new Com(settings);
… ya con la instancia creada, podemos comenzar a leer desde el puerto serie, en este caso, mientras el caracter leído no sea un retorno de carro…
while(!caracter.equals("\n")){
caracter =com1.receiveSingleString();
recibido += caracter;
}
…al final imprimimos los datos que se obtuvieron…
System.out.println(recibido);
… y listo! hemos leído todos los datos obtenidos desde el puerto serial en tan solo 18 líneas de código.
¿Alguna duda o algo qué decir? Deja tu comentario. Saludox.
man me sale el siguiente error:
ResponderBorrarException in thread "main" java.lang.UnsatisfiedLinkError: no libSerialPort in java.library.path
at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1682)
at java.lang.Runtime.loadLibrary0(Runtime.java:822)
at java.lang.System.loadLibrary(System.java:992)
at core.SerialPort.clinit>(SerialPort.java:17)
at javaapplication4.Main.main(Main.java:25)
Java Result: 1
alguna idea pliz?
Qué tal Agustin,
ResponderBorrarAl parecer en tu caso se necesita también del dll que viene con la librería al momento de descomprimirla. Copia el archivo libSerialPort.dll dentro de c:\windows\system32 y vuelve a ejecutar el programa, seguramente el error que te aparece se resolverá.
Espero haberte ayudado. Saludox.
Hola!
BorrarTengo el mismo problema PERO en eclipse en osx; alguna idea?
gracias!
Hola Que tal.. Interesante como muestras el ejemplo..se agradece-..
ResponderBorrarTe comento que cuando compilo, me arroja una serie de errores, creo que estoy haciendo algo mal, dado esto, podrias colocar una imagen
por favor, de como se ve el codigo en netbeans (para ver si estoy colocando comandos en otra posicion)..
Toño.
Holoa, te omento que sigo tu ejemplo y todo funciona bien aparentemente, pero al enviar una cadena por rs-232 aun un modem para darle una orden no funciona y al enviarla por hiperterminal si, no se porque, me doy cuenta que en tu ejemplo no dices como enviar datos, puede ser que lo haga de una forma incorrecta, podrias indicar como funciona esto...
ResponderBorrarPodrias publicar un link con el ejemplo completo o en caso contrario la forma en la que se envia dato RS232
ResponderBorrarhola
ResponderBorraruna pregunta este codigo sirve = para manejar el puerto paralelo
?????????
me ayudaria mucho si respondes pronto
Hola, como estas. Te queria preguntar si sabes de algun ejemplo de como enviar un dato o señal por el puerto y cuando saber que tiene que leer el retorno; esto para aplicarlo a por ejemplo, vos lees un codigo de barra y en caso que exista el mismo en la DB, que emita una señal la cual encendera una luz verde o una luz roja dependiendo el resultado.
ResponderBorrarAparte te queria pedir si podias crear un post, de como crear instaladores con != softwares free.. para crear .exe (por ej: Smart Install Maker o alguno simil) ya que es un tema muuuy cuestionado y pedido por nosotros los amateurs en java.
Desde ya te agradezco y te felicito por la web, esta un caño.
Virgilio Quintero:
ResponderBorrarHola, me pregunto si es posible que alguien me pueda dar el source de la libreria serialport.jar, el problema que tengo es que en linux el nombre del puerto es ttyACM0 y la libreria solo esta asignando los ttyS0, ttyS1, ttyS2 y ttyS3, entonces me gustaria mirar el source para cambiar esa asignacion. El que me pueda ayudar favor escribirme a virgilio.fresno@gmail.com
excelente web, me ha servido montones.
ResponderBorrarte cuento adquiri un Opticon PHL2700 y neceito capturar lso datos de inventario al usar este dispositivo. este opticon genera un archivo de texto, que mediante un aplicacion, qu eme entreegaron donde lo compre, puedo acceder a un archivo plano con separador ",", yo entonces como o que debo hacer para recuperar losdatos y cargarlos en una jtable.
quias estoy pidiendo mucho, pero en pedir no hay engaño
gracias de entemano por tu tiempo y respuesta.
Luis Santander
Angol, Chile
Qué tal,
ResponderBorrarTe comento que para realizar lo que deseas debes seguir los siguientes pasos:
1. Convertir el archivo generado a una cadena de texto.
2. Dividir esa cadena de texto por comas (que en este caso son tus separadores).
3. Procesar la cadena para meterla en un JTable.
Lo primero que necesitas es el siguiente método que te convierte un archivo a una cadena:
public static String archivoACadena(File archivo){
StringBuffer buffer = new StringBuffer();
String linea = "";
FileReader fr;
BufferedReader br;
try {
fr = new FileReader(archivo);
br = new BufferedReader(fr);
while((linea = br.readLine())!=null){
buffer.append(linea);
}
fr.close();
br.close();
} catch (Exception e) {
e.printStackTrace();
}
return buffer.toString();
}
Posteriormente procesas la cadena resultante dividiéndola por comas, algo parecido a lo siguiente:
String [] datos = archivoACadena(new File ("tuArchivo.txt")).split(",");
Y al final puedes ir insertando los datos en el JTable con el método setValueAt(), esto depende directamente de tu modelo.
Espero haberte ayudado. Saludox.
gracias por tu pronta respuesta, voy a probar oque me dices, pronto tendras noticias de miavance..
ResponderBorrarsaludos de chile
Hola , mi nombre es Juan y estoy realizando un proyecto que consiste en conectar un sensor de temperatura a la pc, el sensor esta hecho con un pic y se conecta a la pc por el puerto rs232, gracias toda la ayuda que encontre en este foro puedo o debería poder ver lo que manda hasta el puerto serie, mi dilema es que soy malo programando en java y tengo que darle una pequeña interfaz gráfica y que los datos que lleguen se vean lindos y se pueda mediante un botón o dos mandar una que otra instrucción de corte, si alguien tiene algún código ya hecho que me pudiesen facilitar se los agradecería, se que no es difícil lo que pido pero no soy bueno en java y veo que hacerlo solo me va a demorar mucho. Desde ya muchas gracias.
ResponderBorrarHola Gente
ResponderBorrarHe tratado de probar la clase GiovynetSerialPort1.3 en Netbeans y no me reconoce el codigo me dice en una ventana"cannot find symbol"
"Symbol class serialport" me pueden ayudar con NEtbeans he seguido paso a paso e incluso con el tutorial que aparece en su pagina y nada
alguine tiene un ejemplo que yo puedea descargar para verlo en netbeans para ver si es la configuración que tengo o es el codigo que escribi( que en realidad es una copia de lo que aparece en este foro)
gracias
BUENAS, EL DDL INCLUIDO PARA QUÉ WINDOWS ES? EN MI ORDENADOR MI FUNCIONA PERO EN EL DEL SERVIDOR NO!!! SABES COMO PODRÍA ARREGLARLO? GRACIAS
ResponderBorrarbuen dia estoy probando este codigo y en ubuntu pero envia pero no recibe checken XD
ResponderBorrarSerialPort free = new SerialPort();
////////List portList = free.getFreeSerialPort();
////////for (String string : portList) {
////////System.out.println(string);
////////}
////////
////////Parameters settings = new Parameters();
////////settings.setPort("COM0");
////////settings.setBaudRate("9600");
//////////Instance COM1.
////////Com com1 = new Com(settings);
////////// Settings parameters COM·.
////////settings.setPort("COM1");
////////settings.setBaudRate("9600");
//////////Instance COM3.
////////Com com3 = new Com(settings);
//////////Write COM1.
////////for (int i = 0; i < 4; i++) {
////////System.out.println(">>Send G");
////////com1.sendSingleData('G');
////////}
//////////Read COM3
////////for (int i = 0; i < 4; i++) {
////////System.out.println("<<Receive "+com3.receiveSingleString());
////////}
segun el tuto deberia funcionar pero en netbeans me imprime vacio el asunto de enviado
a ver si hay algo q hcer para ubuntu
funciona perfecto sin embargo tengo una duda con el ruido como filtrar en ruido como hace el mismo linux pues cunado recibo data de mi serial port viene con interferencia
ResponderBorraralguna ayuda pues no quiero limitar los caractes a un rango y convertirlos a ascii
juan.flores@pucp.edu.pe
cualquier ayuda es buena saludos
oye disculpa, he estado probando el codigo pero me marca muchos errores, ¿no podrias subir un ejemplo completo o si me podrias ayudar? te mando mi correo sentex2.0@hotmail.com .................gracias
ResponderBorrargenial lo voy a utilizar cualquier novedad estare comentando
ResponderBorrarmuchas gracias por colocar post de tanta ayuda!!
hola estoy probando el codigo pero me aparecen erores como no se puede encontrar el simbolo, en variaas lineas
ResponderBorrarme podrias ayudar?
oye disculpa eh estado probando pero no me corre
ResponderBorrarno me podrias enviar el codigo para ver que tall
me harias un favor
mi correo
es
orion_329@hotmail.com
Hola
ResponderBorrarEstoy llevando a cabo un proyecto programado en java para enviarle datos por el puerto serie a un robot.
Como podria hacerlo?
de antemano muchas gracias
hola soy nuevo en java por favor nesesito alluda tengo que crear un lector de codigo de barras desde net beans pero la verdad no le ntiendo muy bine si realizo sitemas pero ya saben lo comun consultas reportes bajas altas eliminar todo lo basico pero esta esta fuera de mi capacidad estudio ne la ito de orizaba me llamo samuel y me encantaria que me puedean alludar
ResponderBorraren linux es necesario usar la libSOSerialPort y donde va ubicada esta gracias.
ResponderBorrarhola, Mi nombre es Victor y creo que es muy interesante esto de los puertos con Java, soy novato en la programacion con java, pero estoy muy interesado en aprender. Descargue un archivo de nombre "GiovynetDriver_1.1.rar" y no encontre ninguna
ResponderBorrarlibrería SerialPort.jar. He intentado con la GiovynetDriver, que es la viene ahí...!
Cuales son los cambios para que me funcione, O estoy haciendo algo que no deberia y por eso no me funciona.
Gracias.
vitro012@hotmail.com
Hola amigo oye estoy checando tu programa,
ResponderBorrarpero me marca este error:
java.lang.UnsatisfiedLinkError: no libSerialPort in java.library.path
at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1709)
at java.lang.Runtime.loadLibrary0(Runtime.java:823)
at java.lang.System.loadLibrary(System.java:1030)
at giovynet.nativelink.SerialPort.(SerialPort.java:23)
at ejemplopuertoserie.Main.(Main.java:24)
Exception in thread "main" java.lang.UnsatisfiedLinkError: giovynet.nativelink.SerialPort.getStateSerialPortC(Ljava/lang/String;)Ljava/lang/String;
at giovynet.nativelink.SerialPort.getStateSerialPortC(Native Method)
at giovynet.nativelink.SerialPort.getFreeSerialPort(SerialPort.java:50)
at ejemplopuertoserie.Main.main(Main.java:35)
Java Result: 1
ya puse el archivo de libSerialPort.dll en c://windows/system32
tienes alguna otra solucion
Hola, quiero leer un mouse conectado al COM1, pero no me deja. Como lo hago? Necesito hacer un programita para calcualar la velocidad del mouse
ResponderBorrarHola Monillo007,
ResponderBorrarAnte todo muchas gracias por tu aporte.
Estoy teniendo el mismo problema que mencionaron anteriormente:
java.lang.UnsatisfiedLinkError: no libSerialPort in java.library.path
at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1734)
at java.lang.Runtime.loadLibrary0(Runtime.java:823)
at java.lang.System.loadLibrary(System.java:1028)
at giovynet.nativelink.SerialPort.(SerialPort.java:23)
at com.sap601.tester.EjemploPuertoSerie.(EjemploPuertoSerie.java:19)
Exception in thread "main" java.lang.UnsatisfiedLinkError: giovynet.nativelink.SerialPort.getStateSerialPortC(Ljava/lang/String;)Ljava/lang/String;
at giovynet.nativelink.SerialPort.getStateSerialPortC(Native Method)
at giovynet.nativelink.SerialPort.getFreeSerialPort(SerialPort.java:50)
at com.sap601.tester.EjemploPuertoSerie.main(EjemploPuertoSerie.java:29)
He copiado 'libSerialPort.dll' en C:\windows\system32 pero no funciona.
¿Alguna sugerencia?
Saludos.
Sergio,
ResponderBorrar¿Qué sistema operativo tienes?
Hola Monillo007,
ResponderBorrarDetecté cuál es el problema y dejo la solución para aquellos que se topen con el mismo:
Estoy corriendo el programa con Windows 7
El error era que no encontraba la librería 'libSerialPort.dll', que yo había copiado en 'C:\Windows\system32'. El tema es que las librerías las levanta desde el path que está definido como propiedad 'java.library.path'. Para saber cuál es el valor de dicha propiedad en cada pc se puede hacer: String path = System.getProperty("java.library.path"); System.out.println("java.library.path = " + path);
El resultado de esto es, en mi pc, algo así:
java.library.path = C:\Java\jdk1.6.0_21\bin;.;C:\Windows\Sun\Java\bin;C:\Windows\system32;C:\Windows;C:/Java/jdk1.6.0_21/bin/../jre/bin/client;C:/Java/jdk1.6.0_21/bin/../jre/bin;C:\Java\jdk1.6.0_21\bin;c:\apache-maven-2.2.1\bin;C:\Program Files (x86)\Sybase\SQL Anywhere 9\win32;C:\Program Files (x86)\Sybase\Shared\win32;C:\Program Files (x86)\Sybase\SQL Anywhere 9\drivers;C:\Program Files (x86)\Sybase\Shared\Sybase Central 4.3\win32;C:\Program Files\SQL Anywhere 12\bin64;C:\Program Files\SQL Anywhere 12\bin32.
Como pueden ver figura el path 'C:\Windows\system32': por qué no encuentra las librerías en dicha carpeta es para mi un misterio.
Solución: copié la 'libSerialPort.dll' 'C:\Java\jdk1.6.0_21\bin' y anduvo perfecto.
La causa de la mayoría de mis problemas suelen estar entre el teclado y la silla... :S
Saludos y gracias nuevamente!!
Cuando haces el jar de la aplicacion no encuentra la dll
ResponderBorrarsirve para lectores de codigo de barra usb? gracias
ResponderBorrarQué tal,
ResponderBorrarNo te sirve, este código sirve solo para los lectores que se conectan por puerto serial.
Saludox.
Para los que tienen problemas al generar el jar y no les reconoce es muy recomendable ejecutarlo desde la consola ejemplo "java -jar ruta/archivo" así les muestra los errores y las excepciones que pudieran haber, acuérdense que la librería nativa libSerialPort.dll aparte de colocar en la ruta del java para poder probarlo desde netbeans debe ir también en windows/system32 para que funcione desde el .jar y solamente funciona para maquinas en 32 bits
ResponderBorrarMonolillo has sido como el mas claro por toda la fucking red que a explicado bien esto, y desde el 2010...espero que aun sigas!!
ResponderBorrarDe todas formas tambien tengo dudas haber si me puedes atender, tengo una duda, puedo enviar trasas hexadecimales para que despues manipular los datos que me envia de respuesta solo gyovinet?
Qué tal Raúl,
ResponderBorrarPara serte sincero no entiendo la pregunta :ok:
OH!! gracias por responder y aun existir!!
ResponderBorrarBueno me explayo,
tengo un dispositivo que mide temperatura (es una placa electrica con una antenita) este se conecta mediante usb (con Gyovinet lo leo por atravez del puerto com3).
Primero le envio datos (una trama de datos hexadecimales) donde debo recivir datos al final, los que manipulare para mostrarlos como datos coherentes (y no en ascii o hexadecimal que salen) el problema no esta en el envio, mas bien en la recepcion =/.
este es mi codigo..
import giovynet.*;
import giovynet.nativelink.SerialPort;
import giovynet.serial.Com;
import giovynet.serial.Parameters;
import java.io.IOException;
import java.io.PrintStream;
import java.util.*;
import javax.swing.JOptionPane;
public class inicio {
public static void main(String [] args) throws Exception
{
try{
PrintStream ps=new PrintStream("Resultado.txt");
SerialPort puerto = new SerialPort();
List listaPuertos;
int c=0;
listaPuertos = puerto.getFreeSerialPort();
for (String lista : listaPuertos) {
System.out.println(lista);
}
Parameters seteo = new Parameters();
seteo.setPort("COM3");
seteo.setByteSize("7");
seteo.setStopBits("1");
Com com = new Com(seteo);
for (int i = 0; i < 10; i++) {
/*c++;
Thread.sleep(800);
System.out.println("Envio de dato "+c);
com.sendSingleData(0x7E); //0x7E
com.sendSingleData(0x00);
com.sendSingleData(0x04); //0x06
com.sendSingleData(0x08);
com.sendSingleData(0x52);
com.sendSingleData(0x44);
com.sendSingleData(0x42); //0x05
com.sendSingleData(0x1F);}
int inicio=0;
int long1=0,long2=0,dato1=0,dato2=0,dato3=0,dato4=0,dato5=0,dato6=0,dato7=0,cksum=0;
//Enteros
inicio=com.receiveSingleCharAsInteger();
long1=com.receiveSingleCharAsInteger();
long2=com.receiveSingleCharAsInteger();
dato1=com.receiveSingleCharAsInteger();
dato2=com.receiveSingleCharAsInteger();
dato3=com.receiveSingleCharAsInteger();
dato4=com.receiveSingleCharAsInteger();
dato5=com.receiveSingleCharAsInteger();
dato6=com.receiveSingleCharAsInteger();
cksum=com.receiveSingleCharAsInteger();
}}
esup, espero que puedas man te lo agradeceria mucho.
por seaca el mostreo se lo saque para no adornar mas el codigo en tu blog =/ , de todas formas era con System.ou.prinln nada de otro mundo solo por consola
ResponderBorrarnesecito comunicar modulos zigbee por puerto serial esta libreria me sirve?, pero no puedo descargar la libreria el link no me funciona!!!!!!!!!
ResponderBorrarBuen día, resulta que he probado el codigo y todo corre sin problemas en netbeans pero cuando corro el jar no me reconoce la .dll y se traba el programa... Ayuda Por Favor....
ResponderBorrarQué sistema operativo tienes?
ResponderBorrarEl código que publiqué lo probé enteramente en XP y funciona perfecto, puede que haya problemas de compatibilidad con otros sistemas.
el ciclo infinito que genera
ResponderBorrarwhile(!caracter.equals("\n")){
caracter =com1.receiveSingleString();
recibido += caracter;
}
se puede arreglar haciendo:
do{
caracter =com1.receiveSingleString();
recibido += caracter;
}while(!caracter.equals(""));
hola buen dia.
ResponderBorrartengo el siguiente problema.
resulta que escribo el codigo y todo va bien, lo compilo y ejecuto desde netbeans y todo bien. pero cuando intento ejecutar el .jar
me manda un mensaje "A Java Exception has ocurred" alguien me puede ayudar.
saludos gracias
Qué tal,
ResponderBorrarNecesitas agregar la misma librería GiovynetSerialPort a la carpeta JRE/lib/ext del JRE más reciente en tu sistema operativo.
Saludos
mi nombre es Christian y soy de Peru,una consulta tengo una caja registradora que envia y recibe los datos de la pc (viene con un programa standar y via rs232 ) que me sugieres para manejar los datos que me salen en exell y mostrarlos en un formulario creado en netbeans...
ResponderBorrarFunciona pero genera ciclo infinito, no se arregla con la solucion de arriba
ResponderBorrarHola mi e m a i l es asoucre @ gmail . com:::: Amigo quisiera saber como tu harías para animar objetos con los datos que lea del puerto serial?? La intención no es meter lineas de código sino programar atrevas de objetos.. Amigo lo pregunto es por que no se programar con instrucciones en java solo pura animación de objeto.. Te agradezco tu apoyo y te dejo mi email si me puedes dar algún tips para generarme un mapa de ideas.
ResponderBorrarSaludos,
ResponderBorrarLuis una duda si deseo que el puerto se quede escuchando lo que llegue por el com1
como lo podría hacer ,trabajo con una bascula de pesaje de vehículos en la primera interacción el registra correctamente el peso pero al abandonar el vehículo la bascula ,el puerto no toma el nuevo peso.
Gracias y a espera de tus comentarios
Ya puedo leer datos, ahora pretendo mandar,¿Alguna ayuda monillo007?
ResponderBorrarHola, investigando hay una nueva versión del driver os dejo el enlace: http://www.giovynet.com/giovynetDriver_en.html existe para x64 y x86 hay versión de paga y personal, espero que les sirva.
ResponderBorrarSaludos
Excelente, muchas gracias Emmanuel! :aplauso:
ResponderBorrarBuenas amigo y como seria en el caso de conectar mi sistema con una bascula... ya sea por puerto serialo rj45.. desde gracias y saludos.-.
ResponderBorrarquiero consultarle donLuis como tomar en hexadecimal la señal de datos que envia la balanza, ya logre la conexion conn su ayuda aqui publicada pero no puedo ver lo que envia porque es erroneo.
ResponderBorrarHola, alguien me puede ayudar con la librería GiovynetSerialPort, ya lo busque por todas partes y no esta, alguien de casualidad la tiene descargada, favor de compartir, se le agradece a todos.
ResponderBorrar