Bueno, creo que ya lo tengo solucionado, al final hice esto:
//Archivo com.java
Código:
import javax.comm.*;
import java.io.*;
import java.util.*;
public class com implements SerialReaderListener
{
protected Enumeration ports; //Listado de puertos
protected CommPortIdentifier port_id;
public SerialPort puerto; //Subclase de CommPort
//protected InputStream inputStream; //Para el envio de datos al dispositivo (Subclase de CommPort)
//protected OutputStream outputStream; //Subclase de CommPort
private InputStream inputStream; //Para el envio de datos al dispositivo.
private OutputStream outputStream; //Para la lectura del dispositivo
protected String response; //Ultima linea leida desde el puerto serie
protected boolean debug = true; //flag para el controlar la salida debug
private final int TIMEOUT = 30; //Tiempo de espera maximo para abrir el puerto
//Constructor
com()
{ ports=CommPortIdentifier.getPortIdentifiers();
}
//Busca los puertos disponibles en el PC
public ArrayList listarPuertos()
{
ArrayList<String> nombre_puertos = new ArrayList<String>();
CommPortIdentifier temp_port;
while(ports.hasMoreElements())
{ temp_port=(CommPortIdentifier)ports.nextElement();
if( CommPortIdentifier.PORT_SERIAL==temp_port.getPortType() )
{ nombre_puertos.add( (String) temp_port.getName());
}
}
return nombre_puertos;
}
//Abrir puerto
public Object abrirPuerto(String nombre_puerto)
{ //Cogemos el identificador del puerto
try
{ this.port_id = CommPortIdentifier.getPortIdentifier(nombre_puerto);
}
catch(Exception e)
{ return (String)e.getMessage();
}
//Intentamos abrir el puerto
try
{ puerto = (SerialPort) this.port_id.open("Impresión Etiquetas", TIMEOUT*1000);
}
catch(PortInUseException e)
{ return "Ya hay otra aplicación usando el puerto "+nombre_puerto+".\nEscoge otro.";
}
catch(Exception e)
{ return "Problema abriendo el puerto";
}
//Configuramos el puerto
try
{ puerto.setSerialPortParams(9600, SerialPort.DATABITS_8, SerialPort.STOPBITS_1, SerialPort.PARITY_NONE);
}
catch(UnsupportedCommOperationException e)
{}
//Creamos los canales de entrada/salida de datos
try
{ //inputStream = puerto.getInputStream();
outputStream = puerto.getOutputStream();
//puerto.notifyOnDataAvailable(true);
}
catch(IOException e)
{ return (String) e.getMessage();
}
//Start the thread that reads the serial comm
(new SerialReaderThread(this, this.puerto)).start();
return "1"; //Todo OK
}
public void send(String loQue)
{
try
{ this.outputStream.write(loQue.getBytes());
}
catch(IOException e)
{}
try
{ Thread.sleep(100);
}
catch(Exception e)
{}
}
//Acciones a realizar al recibir datos
public void newData(int data)
{ System.out.print("Datos: "+(char)data);
}
//Cerrar puerto
public void cerrarPuerto()
{ try
{ puerto.close();
}
catch(Exception e){}
}
}
Archivo SerialReaderThread.class
Código:
import java.io.*;
import javax.comm.*;
public class SerialReaderThread extends Thread
{
private SerialReaderListener listener;
public SerialPort puerto;
//Constructor
public SerialReaderThread(SerialReaderListener listener, SerialPort puerto)
{ this.listener = listener;
this.puerto = puerto;
}
public void run()
{ DataInputStream p = null;
try
{ p = new DataInputStream(this.puerto.getInputStream());
int input;
while((input=p.read())!=-1)
listener.newData(input);
}
catch(IOException e)
{}
finally
{ try
{ p.close();
}
catch(IOException e)
{}
}
}
}
Y por ultimo el interface SerialReaderListener.class
Código:
import javax.comm.*;
interface SerialReaderListener
{ void newData(int data);
}
Con esto puedo por fin leer del puerto serie, pero me surgen dos dudas:
1- Los comandos que me envia la impresora pueden estar compuestos por mas de un caracter, pero el codigo arriba escrito no me trata como conjunto todo un comando, sino que simplemente va recibiendo caracteres (y de momento imprimiendolos por pantalla). Como puedo tratar a un conjunto de caracteres como un comando?
Habia pensado en ir metiendo en un array los caracteres a medida que me llegaran, i a la que dejara de recibir datos pasar este array al metodo newData... pero no se como afrontarlo
2-Los caracteres me llegan en formato ASCII, pero no estoy muy convencido de la manera en q los estoy visualizando... (Se que el caracter 13 corresponde al salto de linea, pero en vez de eso se muestra un simbolo muy raro).