Testar comunicação na porta serial  XML
Índice dos Fóruns » Java Avançado
Autor Mensagem
marcossnp
HelloWorld
[Avatar]

Membro desde: 12/12/2007 18:15:58
Mensagens: 13
Offline

Ola galera....

Estou usando a API RXTX para comunicar com a porta serial do computador e testei com um leitor de codigo de barra esta tudo funcionando blz.

Estou com um projeto na faculdade para desenvolver uma aplicação que detecte quando existe algum usuario proximo de um computador . Isso ira funcionar assim:
1 - Peguei um sensor de alarme desse comuns que tem porai;
2 - Fiz uma alimentação 12V direto da fonte do micro;
3 - Na saida dele liguei dois fios que vão até um conexão DB9, onde irei ligar na porta serial.

Baixei um programa que encontrei na internet e esta funcionando certinho, é assim, quando o sensor esta desativado ele fechar um curto no pino 2 e 3 da serial, e quando e sensor é ativado esse curto é desfeito.

Quero desenvolver uma aplicação em JAVA que detecte quando o curto esta fechado ou aberto. E dai vou tratar isso de forma que eu o sistema saiba quando existe alguem proximo ao computador ou não...

O uso deste projeto é voltado para trabalho de monografia na area educacional, a ideia é fazer um programa que interaja com o aluno dando um ideia de um computador que tenha que quantidade X de questoes que o aluno possa estar respondendo, de forma bem interativa.

Agradeço a todos que coloborarem....

Att.: Marcos Silva
[MSN]
pyro
Java Ninja

Membro desde: 17/09/2007 13:13:48
Mensagens: 261
Offline

Se você tem dúvidas no trabalho com a porta serial vai aqui: http://www.viamais.net/blog/index.php?s=rxtx
marcossnp
HelloWorld
[Avatar]

Membro desde: 12/12/2007 18:15:58
Mensagens: 13
Offline

Certo pyro, más a minha duvida é um pouco mais alem, eu ja tive olhando o link acima que vc mecionou e inclusive foi de la que consegui fazer funcionar a comunicação via porta serial.
Mas o problema não esta só na leitura de dados, é que preciso fazer com que ao fechar um curto em dois pinos ligado a porta COM1 o programa reconheça que houve uma entrada de dados e a partir dai eu trato as informações ao ponto de saber quando o sensor estará ativado e desativado...

Vou mandar anexo um programa que encontrei na internet que faz exatamente isso que preciso, ele testa a porta serial quando coloco em curto o pino 2 e 3.
Ele funciona bem em MSDOS ou WIN98, se alguem tiver interesse em dar uma olhada pra poder me ajudar eu fico muito grato...

Att.: Marcos
 Nome do arquivo serial.zip [Disk] Download
 Descrição Testa Serial
 Tamanho 10 Kbytes
 Baixado:  10611 vez(es)

[MSN]
peaga
Entusiasta Java
[Avatar]

Membro desde: 24/06/2008 08:33:51
Mensagens: 23
Offline

marcossnp wrote:Certo pyro, más a minha duvida é um pouco mais alem, eu ja tive olhando o link acima que vc mecionou e inclusive foi de la que consegui fazer funcionar a comunicação via porta serial.
Mas o problema não esta só na leitura de dados, é que preciso fazer com que ao fechar um curto em dois pinos ligado a porta COM1 o programa reconheça que houve uma entrada de dados e a partir dai eu trato as informações ao ponto de saber quando o sensor estará ativado e desativado...

Vou mandar anexo um programa que encontrei na internet que faz exatamente isso que preciso, ele testa a porta serial quando coloco em curto o pino 2 e 3.
Ele funciona bem em MSDOS ou WIN98, se alguem tiver interesse em dar uma olhada pra poder me ajudar eu fico muito grato...

Att.: Marcos


Se você mostrasse o fonte ficaria mais fácil de ajudar.

Porque você não coloca uma varredura de entradas dos dados e excita o sensor para desativar e ativar para ver qual a diferença de entrada?, assim voce pode tratar se eles estão ativados ou desativados, não sei como foi feita a ligação do sensor no DB, mas com certeza a palavra de entrada muda.

ps: Se os pinos 2 e 3 ficão em curto, a alimentação volta, certo? por isso ele "desativa"!
marcossnp
HelloWorld
[Avatar]

Membro desde: 12/12/2007 18:15:58
Mensagens: 13
Offline

Ok peaga, vou detalhar o método que faz a leitura da porta serial...

//inicio do método
public void LerDados()
{
if (Escrita == false)
{
try
{
entrada = porta.getInputStream();
}
catch (Exception e)
{
System.out.println("Erro de stream: " + e);
System.exit(1);
}
try
{
porta.addEventListener(this);
}
catch (Exception e)
{
System.out.println("Erro de listener: " + e);
System.exit(1);
}
porta.notifyOnDataAvailable(true);
try
{
threadLeitura = new Thread(this);
threadLeitura.start();
run();
}
catch (Exception e)
{
System.out.println("Erro de Thred: " + e);
}
}
}
//fim do método ler dados...

Bom usando a API RXTX quando ele encontra alguma coisa na porta então gera um vento e chama outro método que faz a criação de uma String para retorna o que foi lido......

//método de montagem da String
public void serialEvent(SerialPortEvent ev)
{
StringBuffer bufferLeitura = new StringBuffer();
int novoDado = 0;
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:
//Novo algoritmo de leitura.
while(novoDado != -1)
{
try
{
novoDado = entrada.read();
if(novoDado == -1)
{
break;
}
if('\r' == (char)novoDado)
{
bufferLeitura.append('\n');
}
else
{
bufferLeitura.append((char)novoDado);
}
}
catch(IOException ioe)
{
System.out.println("Erro de leitura serial: " + ioe);
}
}
setPeso(new String(bufferLeitura));
System.out.println(getPeso());
break;
}
}
//fim método que capta a entrada de dados na porta serial..

Bom acho que os principais métodos são esses..

Peaga se vc em alguma dica de como fazer uma varedura na porta preciso muito saber como fazer isso.
Mas veja bem, o sensor é um tipo de um rele, ele só manda para a porta se o curto esta aberto ou fechado, através de dois cabos, como se fosse um interruptor (liga e desliga)..

Att.: Marcos
[MSN]
securitynews
JavaChild

Membro desde: 23/06/2008 08:43:41
Mensagens: 100
Offline

Se compreendi a tua pergunta, você deseja que o software saiba quando o sensor detectar algo.

Você tem que deixar uma thread escutando eventos na porta assim como você fez!

Você precisa dar uma atenção especial no método serialEvent, pois é ali que você vai tratar quando um evento ocorre em algum dos pinos.

se não me engano cada um destes representa uma constante referente a um pino

SerialPortEvent.BI:
SerialPortEvent.OE:
SerialPortEvent.FE:
SerialPortEvent.PE:
SerialPortEvent.CD:
SerialPortEvent.CTS:
SerialPortEvent.DSR:
SerialPortEvent.RI:
SerialPortEvent.DATA_AVAILABLE:

Então é só tratar de acordo com sua necessidade.
No seu caso paresse que não existe um protocolo, então a única coisa que você vai fazer é ficar de olho nos eventos, não precisa se preocupar em pegar nada da porta.




Abraço

This message was edited 5 times. Last update was at 22/07/2008 13:28:00

peaga
Entusiasta Java
[Avatar]

Membro desde: 24/06/2008 08:33:51
Mensagens: 23
Offline

Vo tentar te ajudar mas não sei muito referente a codigo na linguagem ( to no aprendizado! ), mas como faço engenharia essas coisas me interessam (to tentando fazer comunicação pela USB no windows, ta dificil heheh).

Entaum, pelo que eu vejo você tem um metodo LerDados() que quando chamado ele le os dados da porta serial certo? a varredura consiste em você ler essa porta constantemente esperando o dado de entrada "aparecer", para isso você faria um loop "infinito" com um delay para não sobrecarregar, e só saira desse loop quando houver uma entrada de dado na porta (um if simples), enquanto não houver entrada (dentro do loop) você poderia deixar o sistema em stand by (pois acredito que a função toda do sistema é baseado na entrada dos dados, sem entrada não tem oque o sistema retornar ao usuário correto?

Oque eu to achando estranho é que o pino 2 é de receber dados e o 3 de transmissao de dados, como que quando colocados em curto o sistema irá reconhecer o hardware? não deveria ser o contrário?
marcossnp
HelloWorld
[Avatar]

Membro desde: 12/12/2007 18:15:58
Mensagens: 13
Offline

Securitynews.
Acho sua colocação otima, mas tem alugma ideia então de qual case eu trataria um evento vindo apenas de um curto-circuito....

Porque é exatamente isso que o sensor faz, quando ele esta inativo ele fica com o curto fechado e quando esta ativo abre o curto....

Ou seja é apenas um sinal aberto ou fechado, não tem nenhum tipo de informação passando porali..
O programa que postei acima faz exatamente isso, ele pede pra colocar em curto o pino 2 e 3 e dai ele dá uma mensagem se houve comunicação ou não..

Etnão a pergunta agora é, existe como fazer essa checagem de curto aberto ou fechado...

Obrigado galera.....Sei que vou conseguir e quando conseguir vou liberar o codigo pra todos.....

Att.: Marcos
[MSN]
marcossnp
HelloWorld
[Avatar]

Membro desde: 12/12/2007 18:15:58
Mensagens: 13
Offline

Peaga..

Cara é exatamente isso que estava precisando de um cara que mandasse bem em Engenharia de Software...

Leia o ultimo post que fiz acima e veja ai se fui bem claro, e se possivel me add ai no seu msn (marcossnp@hgotmail.com) pra batermos um papo hora dessa, pois tenho duvidas nessa area...

E se der comenta lá com com alguem do seu curso de tem como fazer algo parecido....

Há e refente ao sua duvida com a comunicação em USB eu nunca usei ainda, mas vi uma API que fala sobre isso nesse link (http://jusb.sourceforge.net/?selected=types)

Estou aguardando novas dicas......

Att.: Marcos
[MSN]
peaga
Entusiasta Java
[Avatar]

Membro desde: 24/06/2008 08:33:51
Mensagens: 23
Offline

marcossnp wrote:Securitynews.
Acho sua colocação otima, mas tem alugma ideia então de qual case eu trataria um evento vindo apenas de um curto-circuito....

Porque é exatamente isso que o sensor faz, quando ele esta inativo ele fica com o curto fechado e quando esta ativo abre o curto....

Ou seja é apenas um sinal aberto ou fechado, não tem nenhum tipo de informação passando porali..
O programa que postei acima faz exatamente isso, ele pede pra colocar em curto o pino 2 e 3 e dai ele dá uma mensagem se houve comunicação ou não..

Etnão a pergunta agora é, existe como fazer essa checagem de curto aberto ou fechado...

Obrigado galera.....Sei que vou conseguir e quando conseguir vou liberar o codigo pra todos.....

Att.: Marcos


Agora fez mais sentido, estava invertendo as bolas hehehe.

Entaum vamos ve se chegamos em um conclusao, voce quer checar se os pinos estão de curto aberto ou fechado, quando os pinos estiverem em aberto (sensor acionado) ele estará apto a receber e enviar dados, logo se você mandar ler os Dados nesse momento, este será algo diferente de 0x00 (pois por mais que não esteja sendo transmitido nada do sensor para o sistema, ali consta uma tensão qualquer, isso já é o suficiente para retornar um valor para o sistema), o circuito esta aberto e apto a enviar dados, você não precisa filtrar esse dado, ja que só interessa se esta ligado ou desligado. Fazendo o looping com a verificação e o delay que eu disse no post anterior daria para você ficar lendo os Dados que estão no pino constantemente, assim se ( dadoEntrada != 0x00 ) retorna Ligado. ou se ( dadoEntrada ==0x00) retorna ligado.

O código dessa lógica você tem que bolar pois não conheco os comandos e nem qual API você esta usando para a comunicação serial, mas da pra tentar dessa forma
marcossnp
HelloWorld
[Avatar]

Membro desde: 12/12/2007 18:15:58
Mensagens: 13
Offline

Ufa Peaga agora sim fiquei com esperanças...

A final minha duvida era exatamente essa será que apenas um curto aberto ou fechado é o suficiente pra indicar alguma coisa para a porta serial?

Bom vou tentando aki....

Más por enquanto sem sucesso, não sei se os pinos estão certos, talvez possam ser outros pinos....

Se alguem já passou por alguma espericiencia assim de colocar dois pinos em curto e conseguir indentificar isso dentro do programa agradeço a ajuda......

Aguardo novas postagens.....

Att.: Marcos...
[MSN]
marcossnp
HelloWorld
[Avatar]

Membro desde: 12/12/2007 18:15:58
Mensagens: 13
Offline

Não sei fazer tratamento indivdual nos pinos....

Como identificar os pinos da serial em JAVA?????????

esperando respostas...
[MSN]
marcossnp
HelloWorld
[Avatar]

Membro desde: 12/12/2007 18:15:58
Mensagens: 13
Offline

Ola pessoal agradeço a todos que me ajudaram nesse post, mas graças a muitos testes meu problema esta resolvido, vou tentar descrever abaixo como consegui solucionar meu problema usando a API RXTX para captar o movimento de um sensor de presença.

1 - Configurei a API RXTX pra ler a minha porta serial COM1;
2 - Fiz varios teste nos pinos 2 e 3 ou seja RX e TX da porta serial, mas dai encontrei um manual de uma balança dizendo que os testes desses dois pinos é da seguinte forma: (Coloco em curto esses dois pinos, envio alguns bytes pelo pino 3 TX(transmite) e se os dois pinos estiverem em curto recebo os bytes de volta pelo pino 2 RX (recebe), a partir dai abandonei esse pinos pois não estava conseguindo fazer isso;
3 - Parti para outra logica entender como seria o funcionamento real da porta seria, falei com um professor meu da faculdade (Geovane), que me deu umas dicas muito trivial. Contei a ele que havia lido que tinha lido que para haver uma entrada de dados na porta serial teria que ter pulsos eletricos, ou seja, entrar energia mesmo, bom ele de imediato mandou eu medir as tensões do sensor até achar uma energia suficiente para mandar para meus pinos;
4 - Então a partir dai entendi que seria outros pinos o 2 e 5 (2 = RX(recebe)) e (5 = GND(terra)), depois de horas testando, consegui achar dois pontos que resolveram meu problema, liguei o pino 5 na entrada de energia de 12V (entrada negativa) e o pino 2 direto no RELÉ, assim se estabilizou uma energia de 0,15V com o sesor desativado(desligado) e quando o sesor e ativo(ligado) uma energia de 3,61V. Com essas duas voltagens o meu programa consegue identificar que houve uma entrada de dados.
5 - A partir dai eu tratei esses dados de forma logica pra resolver meu problema....

Vou mandar anexo o projeto e como ficou meu resultado usando o Eclipse...

Obrigado a todos que me ajudaram....

Se alguem precisar de alguma dica, me mande email marcossnp@hotmail.com

Att.: Marcos Silva
 Nome do arquivo funcionamento.zip [Disk] Download
 Descrição Projetinho e resultado de meus testes
 Tamanho 95 Kbytes
 Baixado:  1563 vez(es)

[MSN]
Neida
Smalltalk

Membro desde: 13/09/2008 18:22:53
Mensagens: 2
Offline

Oi tudo bem?
Tou a Fazer um TCC sobre um sistema de alarme e faco uso da porta serial que faz a interface entre o computador e o sensor.
Ja tenho o programa kuase pronto e faco a minha apresentacao daki a duas semanas.
marcossnp
HelloWorld
[Avatar]

Membro desde: 12/12/2007 18:15:58
Mensagens: 13
Offline

Neida wrote:Oi tudo bem?
Tou a Fazer um TCC sobre um sistema de alarme e faco uso da porta serial que faz a interface entre o computador e o sensor.
Ja tenho o programa kuase pronto e faco a minha apresentacao daki a duas semanas.


Que bacana, eu também estou trabalhando nisso já tem alguns meses...
Mas vem cá vc esta usando quantos sensores?
Comunica direto ou tem alguma interface (placa) que faz a ponte entre sensor e porta serial?
Que linguagem vc esta usando para desenvolver o programa de comunicação?

Eu uso JAVA e ja estou com o sistema cliente pronto, segue algumas fotos de como esta ficando o software cliente, agora vou passar para o servidor.
[Thumb - relatorio.JPG]
 Nome do arquivo relatorio.JPG [Disk] Download
 Descrição Relatorio de eventos
 Tamanho 38 Kbytes
 Baixado:  418 vez(es)

[Thumb - janela-central.JPG]
 Nome do arquivo janela-central.JPG [Disk] Download
 Descrição Janela
 Tamanho 76 Kbytes
 Baixado:  609 vez(es)

[MSN]
 
Índice dos Fóruns » Java Avançado
Ir para:   
Powered by JForum 2.1.8 © JForum Team