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ó.
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
prsantos
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 */packagebematech.cupom_fiscal;importjava.io.*;importjavax.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 */publicclassComandoImpFiscal{//venda de item com 2 casas decimaisprivatebyteSTX=02;privatebyteNBL;privatebyteNBH;privateStringBufferCMD=newStringBuffer();privatebyteCSL;privatebyteCSH;privateintsomaCommando=0;privatebyte[]frameBuffer;publicstaticbooleancupomAberto;/** * @param args the command line arguments */publicComandoImpFiscal(){}voidmontaCMD(StringBufferdado){CMD.append(dado);for(inti=0;i<(dado.length());i++){somaCommando+=(dado.charAt(i));}}voidmakeFrame(StringBufferCMD){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);ByteArrayOutputStreambos=newByteArrayOutputStream();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(Exceptione){System.out.println("ERRO ......: "+e.toString());}}voidfixaTamanho(StringBuffersb,inttam){if(sb.length()>tam){sb.subSequence(0,tam);}elsewhile(sb.length()<tam){sb.append(" ");}}protectedbyte[]getFrame(){makeFrame(CMD);System.out.println("Tam Frame .: "+frameBuffer.length);System.out.println("Frame .....: "+frameBuffer.toString());returnframeBuffer;}protectedbooleancancelaCupomErro(SerialPortReaderrd)throwsException{//Cancela cupom fiscal em caso de erro na impressoraif(ComandoImpFiscal.cupomAberto){try{ComandoCancelaCupomcom=newComandoCancelaCupom();rd.serialOutput(com.getFrame());Thread.sleep(3000);returnfalse;}catch(Exceptione){e.printStackTrace();}}returnfalse;}publicbooleanimprime(SerialPortReaderrd)throwsException{intretries=0;while(true){rd.serialOutput(this.getFrame());byte[]readBuffer=newbyte[3];try{intnumBytes=0;while(true){while(rd.inputStream.available()>0){numBytes=rd.inputStream.read(readBuffer);}if(numBytes>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 st1bytetest=(byte)(readBuffer[1]/128);if(test>0){// fim de papelJOptionPane.showMessageDialog(null,"Fim de papel");//Cancela cupom fiscalreturncancelaCupomErro(rd);}test=(byte)((readBuffer[1]%128)/64);if(test>0){// pouco papelJOptionPane.showMessageDialog(null,"Pouco papel");//Cancela cupom fiscalreturncancelaCupomErro(rd);}test=(byte)((readBuffer[1]%64)/32);if(test>0){// erro no relogioJOptionPane.showMessageDialog(null,"Erro no relógio.\nContacte o suporte de software");//Cancela cupom fiscalreturncancelaCupomErro(rd);}test=(byte)((readBuffer[1]%32)/16);if(test>0){// impressora em erroJOptionPane.showMessageDialog(null,"Impressora em erro.\nContacte o suporte de hardware");//Cancela cupom fiscalreturncancelaCupomErro(rd);}test=(byte)((readBuffer[1]%16)/8);if(test>0){// CMD nao comecou com ESC (Assist tecnica)JOptionPane.showMessageDialog(null,"CMD não foi iniciado corretamente.\nContacte o suporte de software");//Cancela cupom fiscalreturncancelaCupomErro(rd);}test=(byte)((readBuffer[1]%8)/4);if(test>0){// comando inexistenteJOptionPane.showMessageDialog(null,"Comando inexistente.\nContacte o suporte de software");//Cancela cupom fiscalreturncancelaCupomErro(rd);}test=(byte)((readBuffer[1]%4)/2);if(test>0){// cupom abertoJOptionPane.showMessageDialog(null,"Cupom aberto.");//Cancela cupom fiscalreturncancelaCupomErro(rd);}test=(byte)((readBuffer[1]%2));if(test>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 fiscalreturncancelaCupomErro(rd);}//erros impressora st2bytetest2=(byte)(readBuffer[2]/128);if(test2>0){// tipo de parametro de cmd invalidoJOptionPane.showMessageDialog(null,"Tipo de parâmetro de CMD inválido.\nContacte o suporte de software");//Cancela cupom fiscalreturncancelaCupomErro(rd);}test2=(byte)((readBuffer[2]%128)/64);if(test2>0){// memória fiscal lotadaJOptionPane.showMessageDialog(null,"Memória fiscal lotada.\nContacte o suporte de software");//Cancela cupom fiscalreturncancelaCupomErro(rd);}test2=(byte)((readBuffer[2]%64)/32);if(test2>0){// erro na memoria ram cmos não volatilJOptionPane.showMessageDialog(null,"Erro na memória RAM CMOS não volátil.\nContacte o suporte de hardware");//Cancela cupom fiscalreturncancelaCupomErro(rd);}test2=(byte)((readBuffer[2]%32)/16);if(test2>0){// aliquota nao programadaJOptionPane.showMessageDialog(null,"Alíquota não programada.\nContacte o suporte de software");//Cancela cupom fiscalreturncancelaCupomErro(rd);}test2=(byte)((readBuffer[2]%16)/8);if(test2>0){// capacidade de aliquotas programaveis esgotadaJOptionPane.showMessageDialog(null,"Capacidade de alíquotas programáveis esgotada.\nContacte o suporte de software");//Cancela cupom fiscalreturncancelaCupomErro(rd);}test2=(byte)((readBuffer[2]%8)/4);if(test2>0){// cancelamento nao permitidoJOptionPane.showMessageDialog(null,"Cancelamento não permitido.\nContacte o suporte de software");//Cancela cupom fiscalreturncancelaCupomErro(rd);}test2=(byte)((readBuffer[2]%4)/2);if(test2>0){// CGC/IE do proprietário não programadosJOptionPane.showMessageDialog(null,"CGC/IE do proprietário não programados.\nContacte o suporte de software");//Cancela cupom fiscalreturncancelaCupomErro(rd);}test2=(byte)((readBuffer[2]%2));if(test2>0){retries++;if(retries>20){JOptionPane.showMessageDialog(null,"Comando não executado.\nContacte o suporte de software");//Cancela cupom fiscalreturncancelaCupomErro(rd);}}}}catch(IOExceptione){e.printStackTrace();}}returntrue;}}