[RESOLVIDO] Exemplo de conexão com porta paralela usando Javacomm

3 respostas
Jeanioz

Olá pessoal. Faz muuuuito tempo que eu não crio um tópico pedindo ajuda. Geralmente eu só ajudava os outros ou ficava enchendo as paciências lá no off topic... :lol:

Bem, pessoal, eu preciso criar uma conexão com uma impressora de código de barra através de uma porta paralela usando o Javacomm. Eu preciso apenas enviar dados para a impressora imprimir o código de barras.

Eu já tenho um código para porta serial que funciona perfeitamente, que eu uso para conectar uma balança:

import gnu.io.CommPortIdentifier;
import gnu.io.PortInUseException;
import gnu.io.SerialPort;
import gnu.io.SerialPortEvent;
import gnu.io.SerialPortEventListener;
import gnu.io.UnsupportedCommOperationException;

import java.io.IOException;
import java.io.InputStream;
import java.nio.ByteBuffer;
import java.nio.CharBuffer;
import java.nio.charset.Charset;
import java.nio.charset.CharsetDecoder;
import java.util.Enumeration;
import java.util.TooManyListenersException;

public class App implements Runnable, SerialPortEventListener {
    static CommPortIdentifier portId;
    static Enumeration	      portList;
    InputStream		      inputStream;
    SerialPort		      serialPort;
    Thread		      readThread;
    StringBuilder	saida = new StringBuilder();

    /**
     * Method declaration
     *
     *
     * @param args
     *
     * @see
     */
    public static void main(String[] args) {
    boolean		      portFound = false;
	String defaultPort = "COM1";
	//String defaultPort = "COM2";

 	if (args.length > 0) {
	    defaultPort = args[0];
	} 
   
	portList = CommPortIdentifier.getPortIdentifiers();

	while (portList.hasMoreElements()) {
	    portId = (CommPortIdentifier) portList.nextElement();
	    if (portId.getPortType() == CommPortIdentifier.PORT_SERIAL) {
	    	System.out.println(portId.getName());
		if (defaultPort.equals(portId.getName())) {
		    System.out.println("Found port: "+defaultPort);
		    portFound = true;
		    App reader = new App();
		} 
	    } 
	} 
	if (!portFound) {
	    System.out.println("port " + defaultPort + " not found.");
	} 
 	
    } 

    /**
     * Constructor declaration
     *
     *
     * @see
     */
    public App() {
	try {
	    serialPort = (SerialPort) portId.open("App", 0);
	} catch (PortInUseException e) {}

	try {
	    inputStream = serialPort.getInputStream();
	} catch (IOException e) {}

	try {
	    serialPort.addEventListener(this);
	} catch (TooManyListenersException e) {}

	serialPort.notifyOnDataAvailable(true);

	try {
	    serialPort.setSerialPortParams(9600, SerialPort.DATABITS_8, 
					   SerialPort.STOPBITS_1, 
					   SerialPort.PARITY_NONE);
	} catch (UnsupportedCommOperationException e) {}

	readThread = new Thread(this);

	readThread.start();
    }

    /**
     * Method declaration
     *
     *
     * @see
     */
    public void run() {
	try {
	    Thread.sleep(20000);
	} catch (InterruptedException e) {}
    } 

    /**
     * Method declaration
     *
     *
     * @param event
     *
     * @see
     */
    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[20];

	    try {
 			while (inputStream.available() > 0) {
				inputStream.read(readBuffer);
			}
			
			Charset charset = Charset.forName("US-ASCII");
		    CharsetDecoder decoder = charset.newDecoder();
	    
	        // Convert ISO-LATIN-1 bytes in a ByteBuffer to a character ByteBuffer and then to a string.
	        // The new ByteBuffer is ready to be read.
	        CharBuffer cbuf = decoder.decode(ByteBuffer.wrap(readBuffer));
	        System.out.println(cbuf.toString().trim());
			
		    
	    } catch (Exception e) {
			e.printStackTrace();
		}
	}
    } 
}

Tentei modificar o código usando o ParallelPort do javacomm, etc. mas não deu certo. Estou desde cedo vasculhando a net inteira (e principalmente o guj. "Nunca na história desse fórum se usou tanto a busca...") e só achei o pessoal indicando o parport, mas eu TENHO QUE ser o javacomm para não ter que explicar mais configurações no projeto... :roll:

Então é isso, pessoal. Preciso de uma luz (de preferência um código-exemplo, o que resolveria TUDO :wink: ) e só não postei "SOCORRO!!! URGENTE!!!" no título do tópico por questões éticas. :lol:

3 Respostas

J
Vese se isto resolve o teu caso.

import java.io.FileWriter;

import java.io.IOException;

import java.io.PrintWriter;

FileWriter fw = new FileWriter("//nomeDaEstacao//nomeDaImpressoraNoCompartilhamento");

ou

FileWriter fw = new FileWriter(LPT1);

PrintWriter pw = new PrintWriter(fw);

String comando = xpto

pw.print(comando);

pw.print("\r\n");

pw.close();

Abraços

Boa sorte
Jeanioz

Obrigado pela resposta, mas também não funcionou. :(

Acabei usando o seguinte código, que imprime um código de barra na impressora:

import javax.print.Doc;
import javax.print.DocFlavor;
import javax.print.DocPrintJob;
import javax.print.PrintException;
import javax.print.PrintService;
import javax.print.PrintServiceLookup;
import javax.print.SimpleDoc;
import javax.print.attribute.PrintServiceAttribute;
import javax.print.attribute.standard.PrinterName;
 
public class SimplePrint {
 
    public static void main(String[] args) {
        
        try {
            
            PrintService psZebra = null;
            String sPrinterName = null;
            PrintService[] services = PrintServiceLookup.lookupPrintServices(null, null);
            
            for (int i = 0; i < services.length; i++) {
                
                PrintServiceAttribute attr = services[i].getAttribute(PrinterName.class);
                sPrinterName = ((PrinterName) attr).getValue();
                
                if (sPrinterName.toLowerCase().indexOf("zebra") >= 0) {
                    psZebra = services[i];
                    break;
                }
            }
            
            if (psZebra == null) {
                System.out.println("Zebra printer is not found.");
                return;
            }
            DocPrintJob job = psZebra.createPrintJob();
 
            String s = "^XA^FO100,40^BY3^B3,,30^FD123ABC^XZ";
 
            byte[] by = s.getBytes();
            DocFlavor flavor = DocFlavor.BYTE_ARRAY.AUTOSENSE;
            Doc doc = new SimpleDoc(by, flavor, null);
            job.print(doc, null);
            
        } catch (PrintException e) {
            e.printStackTrace();
        }      
    }
}

Agora vou ter que dar um jeito de colocar Jasper Report nisso. Respire fundo, Jean, respire fundo... :lol:

Jeanioz

Só uma observação.

O código do jmmo funciona, o problema era que tinha que enviar "^XA^FO100,40^BY3^B3,,30^FD123ABC^XZ" ao invés de "xpto":

import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;

public class App3 {

	public static void main(String[] args) {
		FileWriter fw;
		try {
			System.out.print("Testando...");
			fw = new FileWriter("LPT1");
			PrintWriter pw = new PrintWriter(fw);
			//String comando = "xpto";
	        String comando = "^XA^FO100,40^BY3^B3,,30^FD123ABC^XZ";
			pw.print(comando);
			pw.print("\r\n");
			pw.close();
			System.out.println("Fim do teste");
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
}

Isso é uma sintaxe própria das impressoras Zebra (linguagem ZPL II). O problema nem era o Java... :(

Programador Java tem que saber de tudo. :lol:

Criado 12 de novembro de 2008
Ultima resposta 14 de nov. de 2008
Respostas 3
Participantes 2