Ler dados utilizando porta serial

3 respostas
B

Ola a todos.

Estou usando um exemplo da Sun (SimpleRead.java) para fazer a leitura de dados de um equipamento que está conectado numa porta serial.

A dúvida que tenho é o seguinte. É possivel que se faça a leitura dos dados sem usar evento?

O equipamento é um leitor de tarja magnética, mas toda vez que passo um cartão ele dispara varios eventos, mas eu precisaria que ele buscasse todos os dados (uma string com 250 caracteres) de uma vez só.

Alguém ja conseguiu implementar isso?

Obrigado

3 Respostas

P

Email e te mando um exemplo.

T

Uma vez que tive de implementar isso, fiz o seguinte:

  • O primeiro bloco de dados liga um timer de 0,5 segundo.
  • Recebo e concateno os blocos de dados que vieram até que receba algum caracter terminador (costuma vir alguma coisa sempre nesses protocolos) ou então que o timer tenha disparado.
  • Uma vez que o timer disparou ou então que o caracter terminador chegou, processo os dados.
P

Veja se isso serve!

/*
 * Criado em 26/05/2004
 *
 * Para alterar o gabarito para este arquivo gerado vá para
 * Janela>Preferências>Java>Geração de Códigos>Código e Comentários
 */
package bematech.cupom_fiscal;

import java.io.*;

import javax.swing.JOptionPane;
/**
 * @author Vera
 *
 * Para alterar o gabarito para este comentário do tipo gerado vá para
 * Janela>Preferências>Java>Geração de Códigos>Código e Comentários
 */
public class ComandoImpFiscal {
	//venda de item com 2 casas decimais
	private byte STX = 02;
	private byte NBL;
	private byte NBH;
	private StringBuffer CMD = new StringBuffer();
	private byte CSL;
	private byte CSH;
	private int somaCommando = 0;
	private byte[] frameBuffer;
	public static boolean cupomAberto;
	/**
	 * @param args the command line arguments
	 */
	public ComandoImpFiscal() {
	}
    
	void montaCMD(StringBuffer dado){
		CMD.append(dado);
		for (int i = 0; i &lt (dado.length()); i++){
			somaCommando += (dado.charAt(i));
		}
    
	}
	void makeFrame(StringBuffer CMD){
		System.out.println("makeFrame");
		NBL = (byte) ((CMD.length() + 2) % (256));
		NBH = (byte) ((CMD.length() + 2) / (256));
        
		System.out.println("NBL = " + NBL + "   NBH = " + NBH);
        
		CSL = (byte) ((somaCommando) % (256));
		CSH = (byte) ((somaCommando) / (256));  
                 
		System.out.println("CMD-Quantidade de parametros:" + CMD.length());
		System.out.println("CSL = " + CSL + "   CSH = " + CSH);
		ByteArrayOutputStream bos = new ByteArrayOutputStream();
		try{
			bos.write(STX);
			bos.write(NBL);
			bos.write(NBH);
			bos.write(CMD.toString().getBytes());
			bos.write(CSL);
			bos.write(CSH);
			frameBuffer = bos.toByteArray();
			System.out.println("Tam Frame .: " + frameBuffer.length);
		}  catch (Exception e){
			System.out.println("ERRO ......: " + e.toString());
		}
   }
   
	void fixaTamanho(StringBuffer sb, int tam) {
		if (sb.length() &gt tam) {
			sb.subSequence(0, tam);
		} else while (sb.length() &lt tam) {
			sb.append(" ");
		}
	}
	
	protected byte[] getFrame() {
		makeFrame(CMD);
		System.out.println("Tam Frame .: " + frameBuffer.length);
		System.out.println("Frame .....: " + frameBuffer.toString());
		return frameBuffer;
	}
	protected boolean cancelaCupomErro(SerialPortReader rd) throws Exception{
		//Cancela cupom fiscal em caso de erro na impressora
		if (ComandoImpFiscal.cupomAberto) {
			try {
				ComandoCancelaCupom com = new ComandoCancelaCupom();
				rd.serialOutput(com.getFrame());
				Thread.sleep(3000);
				return false;
			}catch(Exception e){
				e.printStackTrace();
			}	
		}
		return false;					
	}
	
    public boolean imprime(SerialPortReader rd) throws Exception {
    	int retries = 0;
        while (true) {
			rd.serialOutput(this.getFrame());
			byte[] readBuffer = new byte[3];
			try {
				int numBytes = 0;
				while (true) {
					while (rd.inputStream.available() &gt 0) {
						numBytes = rd.inputStream.read(readBuffer);
					}
					if (numBytes &gt 0) break;
				}
				System.out.println("Enviado: " + this.getFrame() + " rec - bytes: " + 
				     numBytes + " conteudo: " + readBuffer); 
				     
				System.out.println("0 " + readBuffer[0]);
				System.out.println("1 " + readBuffer[1]);
				System.out.println("2 " + readBuffer[2]);

		        if (readBuffer[0] == 06) {
		        	if (readBuffer[1] == 00 & readBuffer[2] == 00) {
		        		break;                                         // ok
		        	}
		        	// erros impressora st1
		        	byte test = (byte)(readBuffer[1]/128);
		        	if (test &gt 0) {
		        		// fim de papel
		        		JOptionPane.showMessageDialog(null,"Fim de papel");
						//Cancela cupom fiscal
						return cancelaCupomErro(rd);		
		        	}
					test = (byte)((readBuffer[1]%128)/64);
		        	if (test &gt 0) {
						// pouco papel
						JOptionPane.showMessageDialog(null,"Pouco papel");
						//Cancela cupom fiscal
						return cancelaCupomErro(rd);					
					}
					test = (byte)((readBuffer[1]%64)/32);
					if (test &gt 0) {
						// erro no relogio
						JOptionPane.showMessageDialog(null,"Erro no relógio.\nContacte o suporte de software");
						//Cancela cupom fiscal
						return cancelaCupomErro(rd);		
					}
					test = (byte)((readBuffer[1]%32)/16);
					if (test &gt 0) {
						// impressora em erro
						JOptionPane.showMessageDialog(null,"Impressora em erro.\nContacte o suporte de hardware");
						//Cancela cupom fiscal
						return cancelaCupomErro(rd);		
					}
					test = (byte)((readBuffer[1]%16)/8);
					if (test &gt 0) {
						// CMD nao comecou com ESC (Assist tecnica)
						JOptionPane.showMessageDialog(null,"CMD não foi iniciado corretamente.\nContacte o suporte de software");
						//Cancela cupom fiscal
						return cancelaCupomErro(rd);		
					}
					test = (byte)((readBuffer[1]%8)/4);
					if (test &gt 0) {
						// comando inexistente
						JOptionPane.showMessageDialog(null,"Comando inexistente.\nContacte o suporte de software");
						//Cancela cupom fiscal
						return cancelaCupomErro(rd);		
					}
					test = (byte)((readBuffer[1]%4)/2);
					if (test &gt 0) {
						// cupom aberto
						JOptionPane.showMessageDialog(null,"Cupom aberto.");
						//Cancela cupom fiscal
						return cancelaCupomErro(rd);		
					}
					test = (byte)((readBuffer[1]%2));
					if (test &gt 0) {
						// numero de parametros cmd invalido (Assist tecnica)
						JOptionPane.showMessageDialog(null,"Número de parâmetros de CMD inválido.\nContacte o suporte de software");
						//Cancela cupom fiscal
						return cancelaCupomErro(rd);		
					}
					
					//erros impressora st2
					byte test2 = (byte)(readBuffer[2]/128);
					if (test2 &gt 0) {
						// tipo de parametro de cmd invalido
						JOptionPane.showMessageDialog(null,"Tipo de parâmetro de CMD inválido.\nContacte o suporte de software");
						//Cancela cupom fiscal
						return cancelaCupomErro(rd);		
					}
					test2 = (byte)((readBuffer[2]%128)/64);
					if (test2 &gt 0) {
						// memória fiscal lotada
						JOptionPane.showMessageDialog(null,"Memória fiscal lotada.\nContacte o suporte de software");
						//Cancela cupom fiscal
						return cancelaCupomErro(rd);		
					}
					test2 = (byte)((readBuffer[2]%64)/32);
					if (test2 &gt 0) {
						// erro na memoria ram cmos não volatil
						JOptionPane.showMessageDialog(null,"Erro na memória RAM CMOS não volátil.\nContacte o suporte de hardware");
						//Cancela cupom fiscal
						return cancelaCupomErro(rd);		
					}
					test2 = (byte)((readBuffer[2]%32)/16);
					if (test2 &gt 0) {
						// aliquota nao programada
						JOptionPane.showMessageDialog(null,"Alíquota não programada.\nContacte o suporte de software");
						//Cancela cupom fiscal
						return cancelaCupomErro(rd);		
					}
					test2 = (byte)((readBuffer[2]%16)/8);
					if (test2 &gt 0) {
						// capacidade de aliquotas programaveis esgotada
						JOptionPane.showMessageDialog(null,"Capacidade de alíquotas programáveis esgotada.\nContacte o suporte de software");
						//Cancela cupom fiscal
						return cancelaCupomErro(rd);		
					}
					test2 = (byte)((readBuffer[2]%8)/4);
					if (test2 &gt 0) {
						// cancelamento nao permitido
						JOptionPane.showMessageDialog(null,"Cancelamento não permitido.\nContacte o suporte de software");
						//Cancela cupom fiscal
						return cancelaCupomErro(rd);		
					}
					test2 = (byte)((readBuffer[2]%4)/2);
					if (test2 &gt 0) {
						// CGC/IE do proprietário não programados
						JOptionPane.showMessageDialog(null,"CGC/IE do proprietário não programados.\nContacte o suporte de software");
						//Cancela cupom fiscal
						return cancelaCupomErro(rd);		
					}
					test2 = (byte)((readBuffer[2]%2));
					if (test2 &gt 0) {
						retries++;
						if (retries &gt 20) {
							JOptionPane.showMessageDialog(null,"Comando não executado.\nContacte o suporte de software");
							//Cancela cupom fiscal
							return cancelaCupomErro(rd);	
						}
					}
		        }

			} catch (IOException e) {
				e.printStackTrace();
			}
		}
    	return true;
    }
}
Criado 6 de julho de 2007
Ultima resposta 10 de jul. de 2007
Respostas 3
Participantes 3