Para quem conhece javax.comm ou RxTx

1 resposta
C

Fala galera,

Comecei a usar a pouco tempo a API RxTx para leitura de dados da porta serial do computador. Estou desenvolvendo uma aplicação simples que precisa ler dados de uma balança Toledo, dessas de pesar caminhão.

Primeiro fui ate a balanca e conectei o laptop nela atraves do cabo serial, e atraves do Hyperterminal, consegui colher alguns dados que sao enviados.

Importante que observei que esse tipo de balanca fica enviando constantemente a string com o valor da pesagem para o computador, em media 6x por segundo.

Para desenvolver utilizei dois computadores ligados por um cabo serial. Um dos computadores esta simulando a balanca toledo, pois a balanca esta em Vitoria/ES e eu esotu em Sao Paulo, nao tenho como desenvolver o software la. Criei entao um simulador que gera uma String parecida com a gerada pela balanca e fica enviando essa string 6x por segundo.

O Outro computador recebe os dados enviados pelo computador simulador, e faz a leitura da string e os tratamentos necessarios para apresentar o peso.

Bom, para quem conhece javax.comm sabe que existe uma interface chamada SerialPortEventListener, se eu tenho uma classe que implementa essa classe entao tenho que implementar o metodo serialEvent. Esse metodo e disparado sempre que ocorre algum evento na porta serial do computador que esta recebendo os dados.

No meu caso isso esta ocorrendo porem estou com problemas nessa parte.

Para testar o mecanismo criei a seguinte string abcdefghijklmnopqrstuvxyz1234567890 e essa esta sendo enviada 6x por segundo pelo computador simulador.

No receptor existe o seguinte implementacao no metodo serialEvent:

public void serialEvent(SerialPortEvent ev) {
		switch (ev.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:
				try {
					byte[] buffer = new byte[in.available()];
					in.read(buffer);
					System.out.println("RXTX:" + new String(buffer));
				} catch (IOException e) {
					e.printStackTrace();
				} 
		}
	}

A minha intencao e simplesmente imprimir a mesma string que estou enviando do computador simulador, no console do computador receptor.

E eu imagina que o RxTx iria gerar apenas um unico evento para receber toda a String, mas nao e isso que esta acontecendo.

Por incressa que parivel, olha a resposta que eu estou obtendo no console

[list]
Stable Library

Native lib Version = RXTX-2.1-7
Java lib Version = RXTX-2.1-7
RXTX:efghijklmnopqrstuvxyz1234567890
RXTX:abcdefghijklmnop
RXTX:qrstuvxyz1234567890
RXTX:abcdefghijklmnop
RXTX:qrstuvxyz1234567
RXTX:890
RXTX:abcdefghijklmnop
RXTX:qrstuvxy
RXTX:z1234567890
RXTX:abcdefgh
RXTX:ijklmnopqrstuvxyz1234567890
RXTX:abcdefgh
RXTX:ijklmnopqrstuvxy
RXTX:z1234567890
RXTX:abcdefghijklmnop
RXTX:qrstuvxyz1234567890
RXTX:abcdefghijklmnop
RXTX:qrstuvxyz1234567
RXTX:890
RXTX:abcdefghijklmnop
RXTX:qrstuvxyz1234567890
RXTX:abcdefgh
RXTX:ijklmnopqrstuvxy
RXTX:z1234567890
RXTX:abcdefgh
RXTX:ijklmnop
RXTX:qrstuvxyz1234567890
RXTX:abcdefghijklmnop
RXTX:qrstuvxyz1234567
RXTX:890
RXTX:abcdefghijklmnop
RXTX:qrstuvxyz1234567
RXTX:890
[/list]

Perceba que cada minha com pre-fixo RXTX e um evento que esta sendo tratado pelo programa receptor.

Assim ta muito longe de ser uma solucao pois eu esperava o seguinte resultado.

[list]
Stable Library

Native lib Version = RXTX-2.1-7
Java lib Version = RXTX-2.1-7
RXTX:abcdefghijklmnopqrstuvxyz1234567890
RXTX:abcdefghijklmnopqrstuvxyz1234567890
RXTX:abcdefghijklmnopqrstuvxyz1234567890
RXTX:abcdefghijklmnopqrstuvxyz1234567890
RXTX:abcdefghijklmnopqrstuvxyz1234567890
RXTX:abcdefghijklmnopqrstuvxyz1234567890
RXTX:abcdefghijklmnopqrstuvxyz1234567890
RXTX:abcdefghijklmnopqrstuvxyz1234567890
[/list]

O que eu percebi ate agora e que o Rxtx cria varios eventos para a mesma string, enviando ela em pedacos o que confunde meu codigo.

Alguem saberia me dizer como eu faco, para que o rxtx notifique apenas um evento para cada string???

Se alguem souber e puder colaborar eu agradeco muito.

Abraco

1 Resposta

C

Fala colega!

Essa é uma operação normal que está mais relacionada ao SO do que a linguagem de programação propriamente dita.
Se vc utilizar outra linguagem como C# por exemplo, vc obteria os mesmos resultados.
Isso acontece pelo fato dos dados na porta ficarem apenas por um intervalo de tempo curto e pelo tamanho do buffer da serial.
Assim, quando este tempo estoura, um novo evento é gerado.
A solução para este caso é vc colocar um byte de start de um de final. Criar uma máquina de estado e ficar armazendo em um buffer a leitura da porta até que o byte de final seja alcançado.
Espero ter ajudado.

Abraços!

Criado 10 de maio de 2006
Ultima resposta 5 de mar. de 2007
Respostas 1
Participantes 2