GUJ Discussões   :   últimos tópicos   |   categorias   |   GUJ Respostas

Testar comunicação na porta serial


#1

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


#2

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


#3

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


#4

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"!


#5

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


#6

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


#7

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?


#8

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


#9

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


#10

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


#11

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...


#12

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

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

esperando respostas...


#13

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


#14

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.


#15

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.






#16

Pessoal, que tal usar um microcontrolador para fazer a monitoração dos sensores?
Fazer então o microcontrolador enviar os dados via RX TX para o pc via serial ?

Algumas idéias
- fazer o microcontrolador ler os sensores e a cada mudança de estado de alguma das entradas, enviar os dados ao pc.
- fazer o microcontrolador ler os sensores e a cada mudança de estado de alguma das entradas e enviar ao pc a cada período de tempo.

Tudo vai da imaginação e aplicação que se pretende com o projeto.

Estou desenvolvendo uma aplicação parecida, estou pogramando um microcontrolador PIC, estou fazendo um processo de multiplexação para ler 8 sensores e após enviar ao pc via serial. O meu próximo passo é coletar estes dados com JAVA.

Éderson


#17

Amigo eu estou louco correndo atraz disso, porque eu fiz funcionar dessa firma, mas infelizmete só consigo fazer um sensor funcionar...

Teria como vc me add ai pra falarmos mais sobre seu projeto.
Eu tenho a aplicação em java pronto para ler seus dados do seu microcontrolador.

Msn: marcossnp@hotmail.com

Att.: Marcos


#18

Uso um fotoresistor.
Numa ponta tenho o laser e noutra o fotoresistor,quando alguem corta o feixe de luz do laser o fotoresistor detecta a mudanca de luz e alarme e accionado. To usar java, e a unica linguagem k predomino, poukinho ms da para fazer alguma coisa.Ja ta kuase no fim...depois mando o k fiz para veres, e simples ms deu um trabalhao ms valeu pk foi bem interessante.


#19

Bacana isso, mostrar para o mundo o que fazemos..

Estou aguardando para conhecer essa nova técnica.

Assim que o meu ficar todo pronto também irei publicar para todos que tiverem interesse.

Att.: Marcos.


#20

Eu estou também usando a api rxtx, e a solução que eu vejo para o seu problema é colocando um microcontrolador tipo pic para fazer uma interface entre o sensor e o pc....Qualquer microcontrolador serve...
até..