Enviei algumas mensagens para o fórum a respeito de uns problemas que estou tendo com porta serial. Acredito que resolvi mas gostaria de uma opinião de vocês.
O que acontecia?
A aplicação travava ao tentar executar um determinado método, isso porque ele perdia conexão com porta serial.
Use o método envia dados que dará para resolver se colocar a implementação dele com threads fica melhor ainda
publicintenviaDados(byte[]buf,inttimeOut,intsizeEsperado,booleancheckErro)throwsIOException{buf=preparaComando(buf);InputStreamin=getPort().getInputStream();OutputStreamout=getPort().getOutputStream();out.write(buf);out.flush();out.close();longend=System.currentTimeMillis()+timeOut;sizeResposta=0;lenEsperado=sizeEsperado;intret;do{ret=in.read(buffer,sizeResposta,buffer.length-sizeResposta);//System.out.println("retorno: " + ret);if(ret>0){sizeResposta+=ret;}if(respostaConcluido()){break;}if(getSizeResposta()>=buffer.length){break;}}while(end>System.currentTimeMillis());//! new VTimer(5000).contar()System.out.println("retorno: ");for(inti=0;i<getSizeResposta();i++){System.out.print(" "+buffer[i]);}ret=getErro();if(checkErro){validaResposta(ret);}returnret;}publicvoidabrePorta(inttimeOut)throwsNoSuchPortException,UnsupportedCommOperationException,PortInUseException{CommPortIdentifieridentifier=CommPortIdentifier.getPortIdentifier("COM"+String.valueOf(getnumPorta()));setPort((SerialPort)identifier.open("abc",timeOut));getPort().setSerialPortParams(getBaudRate(),SerialPort.DATABITS_8,SerialPort.STOPBITS_1,SerialPort.PARITY_NONE);getPort().setFlowControlMode(SerialPort.FLOWCONTROL_NONE);getPort().setRTS(true);getPort().setDTR(true);}
augustocolom
viniciusalvess:
Use o método envia dados que dará para resolver se colocar a implementação dele com threads fica melhor ainda
publicintenviaDados(byte[]buf,inttimeOut,intsizeEsperado,booleancheckErro)throwsIOException{buf=preparaComando(buf);InputStreamin=getPort().getInputStream();OutputStreamout=getPort().getOutputStream();out.write(buf);out.flush();out.close();longend=System.currentTimeMillis()+timeOut;sizeResposta=0;lenEsperado=sizeEsperado;intret;do{ret=in.read(buffer,sizeResposta,buffer.length-sizeResposta);//System.out.println("retorno: " + ret);if(ret>0){sizeResposta+=ret;}if(respostaConcluido()){break;}if(getSizeResposta()>=buffer.length){break;}}while(end>System.currentTimeMillis());//! new VTimer(5000).contar()System.out.println("retorno: ");for(inti=0;i<getSizeResposta();i++){System.out.print(" "+buffer[i]);}ret=getErro();if(checkErro){validaResposta(ret);}returnret;}publicvoidabrePorta(inttimeOut)throwsNoSuchPortException,UnsupportedCommOperationException,PortInUseException{CommPortIdentifieridentifier=CommPortIdentifier.getPortIdentifier("COM"+String.valueOf(getnumPorta()));setPort((SerialPort)identifier.open("abc",timeOut));getPort().setSerialPortParams(getBaudRate(),SerialPort.DATABITS_8,SerialPort.STOPBITS_1,SerialPort.PARITY_NONE);getPort().setFlowControlMode(SerialPort.FLOWCONTROL_NONE);getPort().setRTS(true);getPort().setDTR(true);}
Vinicuis, obrigado pela resposta.
Então seria subistituir o momento de fechar conexão 'pelo método enviaDados()?
Referente aos argumentos deste método:
buf, timeout, sizeesperado, checkerro, eu os defino staticamente?
No caso, preciso fechar porta serial que é instância de "SerialPort", eu o aplicaria onde são fechadoos o InputStream e OutPutStream?
Outro ponto, se eu chamar no enviadados o close() ele vai me travar do mesmo jeito, a nao ser que eu use threads,certo?
Agradeço novamente
viniciusalvess
Esse método que te mandei , foi que eu implementei há algumas semanas atráz para fazer comunicação direta com ECF , tenho um método apart para fechar a porta. pois comunicação serial normalmente se fecha a porta somente quando a aplicação é fechada.