Ler Porta Serial

Java

12/11/2013

Pessoal blz?


Eu queria saber como ler uma porta serial e pegar os valores dele e separar os dados...

Nunca fiz nada nem parecido, nem sei se ele fica lendo os dados constante ou se manda uma vez e para....

Tentei seguir o exemplo daqui do devmedia mas não deu certo, não lê os dados... sei que o rate é de 19200


Usei um exemplo chamado BlackBox que é mais ou menos o que quero, a diferença é que não vou mostrar num campo e sim pegar cada valor e separar campo à campo.
Rafael Diniz

Rafael Diniz

Curtidas 0

Respostas

[desativado] Gonçalves

[desativado] Gonçalves

12/11/2013

Olá Rafael,

para falar com portas seriais em JAVA você vai trabalhar com SOCKETS.

A Oracle disponibilizou a terceira versão da Java Communications API que permite, entre outras coisas, conexão, controle, taxas de transferência, leitura, gravação, etc ...

Os links abaixo demonstram como realizar leitura e gravação.

http://stackoverflow.com/questions/336714/reading-serial-port-in-java
http://www.java2s.com/Code/Java/Development-Class/COM-Port.htm

Abaixo, o link para a Java Communication API

http://www.oracle.com/technetwork/java/index-jsp-141752.html

Se quiser tirar dúvida de algo que você venha a escrever, coloca aqui que eu te ajudo.
GOSTEI 0
Rafael Diniz

Rafael Diniz

12/11/2013

Muito obrigado dvm.lc.ledcrash... eu começarei a estudar isso e o projeto a semana que vem.. com certeza terei dúvidas, rsrs.. mas valeu pelas dicas... agora tenho um caminho pelo menos a seguir.


GOSTEI 0
Rafael Diniz

Rafael Diniz

12/11/2013

dvm.lc.ledcrash

Estou conseguindo ler a porta e tal.. mas estou com problema de lógica...

É assim, tenho dispositivos diferentes, e ele mostra o modelo dele na primeira linha de dados enviados da porta... ai queria pegar esse modelo e enviar para a leitura do buffer para a classe respectiva do modelo.

Tentei usar getters e setters mas da erro, pois parece que cada envio do buffer ele zera as variáveis.


Resumindo, é pegar o modelo nos dados do buffer e depois só mandar os buffers para a classe correta, e não tendo que procurar o modelo toda hora (mesmo que isso seja praticamente impossível)
GOSTEI 0
[desativado] Gonçalves

[desativado] Gonçalves

12/11/2013

Rafael,

preciso de mais detalhes. Tem como postar parte do codigo, telas, etc? Senao vai ficar dificil somente com os dados que voce passou ...
GOSTEI 0
Rafael Diniz

Rafael Diniz

12/11/2013

Consegui.. foi um erro primário, rsrs... deixei no SerialEvent a criação dos objetos de classe nele, e como esse método do serial fica sendo chamado todo instante ele estava criando tudo do zero de novo...

Desculpe por postar sem analisar bem, antes
GOSTEI 0
Rafael Diniz

Rafael Diniz

12/11/2013

devm

Tenho estes dois métodos que leem a porta serial... o primeiro trata de um jeito mais lento e o outro mais rápido e traz mais valores... só que não posso usar o 2 do jeito que ta pq é utilizado por outro sistema e não quero plagiar...

vc poderia me ajudar com um bom método de ler porta serial? para preencher bem o buffer e rápido e com mais informações como o 2?


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[2048];
			try {
				int numBytes = 0;
				while (inputStream.available() > 0) {
					try
					{
						synchronized (this) {
							wait(10000L);
						}
					}

					catch (InterruptedException e)
					{
					}
					
					numBytes = inputStream.read(readBuffer);
					
				}
				String result = new String(readBuffer);
				result = result.substring(1, numBytes);
				System.out.println("Lendo ======================================================");
				System.out.println(result);


				inicio.validaDados(result);
				
				
			} catch (IOException e) {
				System.out.println(e);
			}

			break;
		}
	}

	
	
	public void serialEvent2(SerialPortEvent event)
	  {
	    StringBuffer bufferLeitura = new StringBuffer();
	    int novoDado = 0;
	    switch (event.getEventType())
	    {
	    case 1: 
	      while (novoDado != -1) {
	        try
	        {
	          novoDado = inputStream.read();
	          if (novoDado == -1) {
	            break;
	          }
	          if ('\r' != (char)novoDado) {
	            bufferLeitura.append((char)novoDado);
	          }
	        }
	        catch (IOException ioe)
	        {
	          System.out.println("ERRO - Erro de leitura serial: " + ioe);
	        }
	      }
	      inicio.validaDados(new String(bufferLeitura));
	      System.out.println(bufferLeitura + "\n");
	    }
	  }
	
GOSTEI 0
[desativado] Gonçalves

[desativado] Gonçalves

12/11/2013

Rafael, a grosso modo seu programa tem um gargalo que é o wait de 100 segundos que você coloca durante a leitura dos dados.

Isto é realmente necessário? Você tentou diminuir este valor? 100 segundos ou 100000L que você colocou é 1 minuto 3 40 segundos por leitura ...

Será que isto não resolveria?

Não tenho como testar teu código porque não tenho (além da USB) nenhuma porta serial, cabo, dispositivo pronto para transmitir e testar, etc ... é um chute.
GOSTEI 0
Rafael Diniz

Rafael Diniz

12/11/2013

é que neste primeiro modo se não coloco esse syncronized, ele não lê a linha, e manda "uma letra" de cada vez, e não um bloco de informações... não compreendi a lógica ainda pq as vezes vem de um jeito e as vezes de outro...
GOSTEI 0
[desativado] Gonçalves

[desativado] Gonçalves

12/11/2013

Legal, mas, diminui o tempo para ver se melhora ...
GOSTEI 0
Rafael Diniz

Rafael Diniz

12/11/2013

oi dvm, melhorou sim...

só que ainda tem dados que não vem...

ainda não consegui identificar esse motivo, que um vem normalmente e o outro não
GOSTEI 0
POSTAR