Java - Leitura de dados da porta serial

12 respostas
V

Gente eu estou desenvolvendo uma aplicação aqui que precisa ler dados da porta serial.
Eu estou utilizando uma classe interna que estende Thread pra receber os dados da porta e atualizar algumas coisas no meu programa.
Mas o problema é que Enquanto a Thread esta lendo da porta serial eu não consigo enviar nada pra porta, por ex:

-Thread rodando e lendo da porta e ao mesmo tempo o usuário clica num botão que precisa enviar algum dado pra porta...

Nesse caso se ao mesmo tempo que a Thread esta lendo e o usuario envia algo pra porta, muitas vezes a ação que o usuario fez não funciona.......

ALguem pode me dar uma ajuda ??

Implementacao da Thread:

private class ReadStatus extends Thread {
		public boolean isWait = false;

		void setWait(boolean f) {
			isWait = f;
		}

		@Override
		public void run() {
			while (true) {
				synchronized (this) {
					while (isWait) {
						try {
							wait();
						} catch (InterruptedException e) {
							e.printStackTrace();
						}
					}
				}
				serial.writeOnPort("test1");
				serial.writeOnPort("test2");
				serial.writeOnPort("test3");
				serial.writeOnPort("test4");
				serial.writeOnPort("test5");
				serial.writeOnPort("test6");
				String[] status = { serial.readFromPort(), serial.readFromPort(), serial.readFromPort(), serial.readFromPort(),
						serial.readFromPort(), serial.readFromPort() };
				jl1.setText(status[0]);
				jl2.setText(status[1]);
				jl3.setText(status[2]);
				jl4.setText(status[3]);
				jl5.setText(status[4]);
				jl6.setText(status[5]);
			}
		}
	}

Nesse caso aqui eu preciso enviar um dado pra porta, pro equipamento me responder.

12 Respostas

M

Eu já fiz isso, utilizei uma API chamada CommAPI pra isso, e funcionava tranquilo, ele vinha inclusive com uma app chamada blackbox pra testar… Qual API vc ta usando?

V

Estou usando o RXTX

V

Mitidiero, você por acaso sabe como faço isso usando o RXTX ( RXTX tem os mesmos metodos do COMMPAI, iguaizinhos ) ?

V

ALguem tem alguma solucao ?

V

Apenas UP no post…

Gente me ajudem, não estou conseguindo fazer.

E

Olá, Vinicius Zibetti Resko!

Infelizmente a porta serial só pode ser acessada por uma Thread de cada vez.
Você pode fazer a mesma Thread enviar E receber esses dados. Ex.:

Thread 1 abre porta COM5
Thread 1 recebe dados da porta COM5
Thread 1 recebe dados da porta COM5
Thread 1 recebe dados da porta COM5
Thread 1 recebe dados da porta COM5
Thread 1 recebe dados da porta COM5
Thread 1 envia dados para porta COM5
Thread 1 fecha a porta

Se você tentar fazer isso:

Thread 1 abre porta COM5
Thread 1 recebe dados da porta COM5
Thread 2 recebe dados da porta COM5

O java vai lançar PortInUseException.

Espero ter ajudado.

V

Olá, a informacao é enviada da mesma forma por que estou utilizando a mesma insancia pra fazer isso, o que ocorre é que ele enfileira os dados pra enviar pra porta serial, essa parte eu ja resolvi, mas agora ta dando um bug aqui SNISTRO…
Quando eu clico num botao eu paro a Thread (anti deadlock que eu inplementei) envio a informacao, dps volto a thread a funcionar…
Funciona perfeitamente mas tem hora que ele trava NÃO SEI O MOTIVO.

essa pausa na thread funciona assim:

na classe da thread tem:

isWait = false; while(true){ while(isWait){ this.wait(); } resto das operacoes... }

Ele faz certinho essa parte, le entra ali naquele loop enquanto ta pausado, dps que despausa ele continua…
Clicou no botao:
isWait = true;//para de enviar comandos pra porta
operacao do botao… // envia algum comando pra porta
isWait = false;// volta a enviar informacoes pra porta

Mas tem hora cara que ele entra naquele loop ali e não sai…

SINISTRO ISSO, SINISTROO…

V

Topico ainda não esta morto…

V

->

V

->

V

Isso você só resolve estudando como funciona sincronização entre threads.

O ideal é deixar a thread que atualiza a porta serial isolada e fazer a comunicação apenas através de mensagens. Isso inclui uma mensagem de pausa.
Se você quiser usar uma variável de controle para a pausa, certifique-se que ela é atualizada apenas em blocos sincronizados, ou que ela seja declarada como volatile.

Threads e sincronização é um assunto que deve ser levado a sério. Se você não entende esses conceitos perfeitamente, vai apanhar muito e ter dores de cabeça fortes. Procure um livro como Java Concurrency em Practice, e volte a estudar os conceitos de threads que você já deve ter visto na aula de Sistemas Operacionais.

Finalmente, não fique upando tópicos achando que alguém vai vir aqui e resolver sua dúvida. Threads e serial são assuntos extremamente específicos. Os programas com threads são difíceis de depurar e mais difíceis ainda de imaginarmos que problema pode estar ocorrendo com seu código, especialmente se ele for mal feito. Ao invés de simplesmente upar o tópico, forneça mais informação, como mais detalhes do seu código fonte, ou dados do log que você está gerando.

P

Olá Vinicius tudo bom?

Vc Conseguiu fazer isso?

Eu estou precisando ler as informações de uma porta serial (são informações constantes) e mostrar na tela swing (a tela já fiz) só não estou conseguindo ler os dados da serial…

esta na COM3 e no rate 19200, consegui ler pelo programa BlackBox que encontrei na net, o que eu quero é semelhante, a diferença é que quero pegar os valores e setar em campos.

Criado 29 de março de 2012
Ultima resposta 11 de nov. de 2013
Respostas 12
Participantes 5