Ler Porta Serial
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.
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
Curtidas 0
Respostas
[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.
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
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
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)
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
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 ...
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
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
Desculpe por postar sem analisar bem, antes
GOSTEI 0
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?
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
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.
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
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
12/11/2013
Legal, mas, diminui o tempo para ver se melhora ...
GOSTEI 0
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
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