Uso de Thread para solucionar demora em resposta

3 respostas
augustocolom

Olá pessoal,

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.

O que fiz?

Joguei a execução deste método em uma thread.

Antes era assim:

serialPort.close();

Para resolver deixei assim:

new Thread(){
                public void run(){
                        serialPort.close();
                }
            }.start();

Parece que resolveu o problema, pois não trava a aplicação na hora de fexar conexão com porta serial, alguém sugere algo?

3 Respostas

viniciusalvess

Use o método envia dados que dará para resolver se colocar a implementação dele com threads fica melhor ainda

public int enviaDados(byte[] buf, int timeOut, int sizeEsperado, boolean checkErro) throws IOException{
		buf = preparaComando(buf);
		
		InputStream in = getPort().getInputStream();
		OutputStream out = getPort().getOutputStream();
		out.write(buf);
		out.flush();
		out.close();		

		long end = System.currentTimeMillis() + timeOut;
		sizeResposta = 0;
		lenEsperado = sizeEsperado;
		
		int ret;

		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 (int i = 0; i < getSizeResposta(); i++) {
			System.out.print(" " + buffer[i]);
			
		} 
		ret = getErro();
		
		if (checkErro) { 
			validaResposta(ret);
		} 
			
		return ret;		
	}

public void abrePorta(int timeOut) throws NoSuchPortException, UnsupportedCommOperationException, PortInUseException{		
		CommPortIdentifier identifier = 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
public int enviaDados(byte[] buf, int timeOut, int sizeEsperado, boolean checkErro) throws IOException{
		buf = preparaComando(buf);
		
		InputStream in = getPort().getInputStream();
		OutputStream out = getPort().getOutputStream();
		out.write(buf);
		out.flush();
		out.close();		

		long end = System.currentTimeMillis() + timeOut;
		sizeResposta = 0;
		lenEsperado = sizeEsperado;
		
		int ret;

		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 (int i = 0; i < getSizeResposta(); i++) {
			System.out.print(" " + buffer[i]);
			
		} 
		ret = getErro();
		
		if (checkErro) { 
			validaResposta(ret);
		} 
			
		return ret;		
	}

public void abrePorta(int timeOut) throws NoSuchPortException, UnsupportedCommOperationException, PortInUseException{		
		CommPortIdentifier identifier = 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.

Criado 26 de fevereiro de 2011
Ultima resposta 26 de fev. de 2011
Respostas 3
Participantes 2