Ver Mensaje Individual
  #8 (permalink)  
Antiguo 14/11/2006, 04:20
clinisbut
 
Fecha de Ingreso: diciembre-2004
Mensajes: 278
Antigüedad: 19 años, 11 meses
Puntos: 0
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).

Última edición por clinisbut; 14/11/2006 a las 05:00