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

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:

[code]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();
	}
}
} 

}[/code]

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:

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

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

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

[code]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();
    }      
}

}
[/code]

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

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”:

[code]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();
	}
}

}[/code]

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

Programador Java tem que saber de tudo. :lol: