Problemas em ler dados na porta serial

Galera to com problemas em ler dados na porta serial to usando a api comm da sun e o programinha de teste q achei num artigo ta rodando e nao ta dando nenhum erro porem tmb nao ler os dados q eram pra ser lidos… abaixo vou colokar as 3 classes q to usando, se alguem puder ajudar agradeco muito…

*** lembrando ele aparentemente envia a string , mas nao sei tmb se ta enviando corretamente, pois so conseguiria ver se ele lesse alguma resposta porem nao to conseguindo ler os dados, abaixo ta a resposta da compilacao e mais abaixo ainda as classes…

/*
 * SComm.java
 *
 * Created on September 2por7, 2007, 7:33 AM
 *
 * To change this template, choose Tools | Template Manager
 * and open the template in the editor.
 */

package srcom;
import javax.comm.*;
import java.io.*;
import java.lang.Runnable.*;
//classe Principal
public class SComm implements SerialPortEventListener, Runnable {
//propriedades
private String Porta;
public String Dadoslidos;
public int nodeBytes;
private int baudrate;
private int timeout;
private CommPortIdentifier cp;
private SerialPort porta;
private OutputStream saida;
private InputStream entrada;
private Thread threadLeitura;
//indicadores
private boolean IDPortaOK; //true porta EXISTE
private boolean PortaOK;// true porta aberta
private boolean Leitura;
private boolean Escrita;
//construtor default paridade : par
//baudrate: 9600 bps stopbits: 2 COM 1
public SComm() {
Porta = "/dev/ttyS1";
baudrate = 9600;
timeout = 1000;
};
//um Objeto ComObj é passado ao construtor
//com detalhes de qual porta abrir
//e informações sobre configurações
public SComm( String p , int b , int t ){
this.Porta = p;
this.baudrate = b;
this.timeout = t;
}
//habilita escrita de dados
public void HabilitarEscrita(){
Escrita = true;
Leitura = false;
}
//habilita leitura de dados
public void HabilitarLeitura(){
Escrita = false;
Leitura = true;
}
//Obtém o ID da PORTA
public void ObterIdDaPorta(){
try {
cp = CommPortIdentifier.getPortIdentifier(Porta);
if ( cp == null ) {
System.out.println("A " + Porta + " nao existe!" );
System.out.println("ERRO!Abortando..." );

IDPortaOK = false;
System.exit(1);
}
IDPortaOK = true;
} catch (Exception e) {
System.out.println("Erro durante o procedimento. STATUS" + e );
IDPortaOK = false;
System.exit(1);
}
}
//Abre a comunicação da porta
public void AbrirPorta(){
try {
porta = (SerialPort)cp.open("SComm",timeout);
PortaOK = true;
System.out.println("Porta aberta com sucesso!");
//configurar parâmetros
porta.setSerialPortParams(baudrate,
porta.DATABITS_8,
porta.STOPBITS_2,
porta.PARITY_NONE);
} catch (Exception e) {
PortaOK = false;
System.out.println("Erro ao abrir a porta! STATUS: " + e );
System.exit(1);
}
}
//função que envie um bit para a porta serial
public void EnviarUmaString(String msg){
if (Escrita==true) {
try {
saida = porta.getOutputStream();
System.out.println("FLUXO OK!");
} catch (Exception e) {
System.out.println("Erro.STATUS: " + e );
}
try {
System.out.println("Enviando um byte para " + Porta );
System.out.println("Enviando : " + msg );
saida.write(msg.getBytes());
Thread.sleep(100);
saida.flush();
} catch (Exception e) {
System.out.println("Houve um erro durante o envio. ");
System.out.println("STATUS: " + e );
System.exit(1);
}
} else {
System.exit(1);
}
}
//leitura de dados na serial
public void LerDados(){
if (Escrita == true){
try {
entrada = porta.getInputStream();
System.out.println("FLUXO OK!");
} catch (Exception e) {
System.out.println("Erro.STATUS: " + e );
System.exit(1);
}
try {
porta.addEventListener(this);
System.out.println("SUCESSO. Porta aguardando...");
} catch (Exception e) {
System.out.println("Erro ao criar listener: ");
System.out.println("STATUS: " + e);
System.exit(1);
}
porta.notifyOnDataAvailable(true);
try {
threadLeitura = new Thread(this);
threadLeitura.start();
} catch (Exception e) {
System.out.println("Erro ao iniciar leitura: " + e );
}
}
}
//método RUN da thread de leitura
public void run(){
try {
Thread.sleep(5000);
} catch (Exception e) {
System.out.println("Erro. Status = " + e );
}
}
//gerenciador de eventos de leitura na serial
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:
byte[] bufferLeitura = new byte[20];
try {
while ( entrada.available() > 0 ) {
nodeBytes = entrada.read(bufferLeitura);
}
String Dadoslidos = new String(bufferLeitura);
if (bufferLeitura.length == 0) {
System.out.println("Nada lido!");
} else if (bufferLeitura.length == 1 ){
System.out.println("Apenas um byte foi lido!");
} else {
System.out.println(Dadoslidos);
}
} catch (Exception e) {
System.out.println("Erro durante a leitura: " + e );
}
System.out.println("n.o de bytes lidos : " + nodeBytes );
break;
}
}
//função que fecha a conexão
public void FecharCom(){
try {
porta.close();
System.out.println("CONEXAO FECHADA>>FIM..");
} catch (Exception e) {
System.out.println("ERRO AO FECHAR. STATUS: " + e );
System.exit(0);
}
}
//Acessores
public String obterPorta(){
return Porta;
}
public int obterBaudrate(){
return baudrate;
}
}
/*
 * SerialCom.java
 *
 * Created on September 27, 2007, 7:34 AM
 *
 * To change this template, choose Tools | Template Manager
 * and open the template in the editor.
 */

package SrCom;
import javax.comm.*;
import java.io.*;
import java.util.*;
public class SerialCom {
//*********************************
//Variáveis
//*********************************
//variáveis para identificar portas
protected String[] portas;
protected Enumeration listaDePortas;
//construtor
public SerialCom(){
listaDePortas = CommPortIdentifier.getPortIdentifiers();
}
//retorna as portas disponíveis
public String[] ObterPortas(){
return portas;
}
//Copia portas para um Array
protected void ListarPortas(){
int i = 0;
portas = new String[10];
while (listaDePortas.hasMoreElements()) {
CommPortIdentifier ips =
(CommPortIdentifier)listaDePortas.nextElement();
portas[i] = ips.getName();
i++;
}
}
//pesquisa se a Porta existe
public boolean PortaExiste(String COMp){
String temp;
boolean e = false;
while (listaDePortas.hasMoreElements()) {
CommPortIdentifier ips =
(CommPortIdentifier)listaDePortas.nextElement();
temp = ips.getName();
if (temp.equals(COMp)== true) {
e = true;
};
}
return e;
}
//imprime as portas disponíveis
protected void ImprimePortas(){
for (int i = 0 ; i < portas.length ; i ++ ) {
if (portas[i] != null ) {
System.out.print(portas[i] + " ");
}
}
System.out.println(" ");
}
}
//*****************************************************************************
import SrCom.*;
import java.lang.RuntimeException;

public class Stest2 extends SerialCom {
public Stest2(){
super();
}
public static void main(String[] args){

    Stest2 st = new Stest2();
        if ( st.PortaExiste("/dev/ttyS2") == true) {            
            System.out.println("Iniciando comunicação porta serial para escrever");
            
            SComm sc = new SComm("/dev/ttyS2",9600,2000);
   
            sc.HabilitarEscrita();
            sc.ObterIdDaPorta();
            sc.AbrirPorta();
            sc.EnviarUmaString("O");
            sc.LerDados();
            sc.FecharCom();
        }

    Stest2 st2 = new Stest2();
        if ( st2.PortaExiste("/dev/ttyS2") == true) {
            System.out.println("Iniciando comunicacao da porta para LER!");
            
            SComm sc2 = new SComm("/dev/ttyS2",9600,2000);
          
            sc2.HabilitarLeitura();
            sc2.ObterIdDaPorta();
            sc2.AbrirPorta();
            sc2.LerDados();
            sc2.FecharCom();
        }  
             
    }
}

Olha vc fez a instalação correta? Parece ser isto, experimente acessar esse tutorial http://www.viamais.net/blog/?p=26 fala da API RXTX, muito boa para leitura serial, mas o processo de instalação descrito lá também serve para a Javacomm.
Qualquer coisa grita aí.

[quote=pyro]Olha vc fez a instalação correta? Parece ser isto, experimente acessar esse tutorial http://www.viamais.net/blog/?p=26 fala da API RXTX, muito boa para leitura serial, mas o processo de instalação descrito lá também serve para a Javacomm.
Qualquer coisa grita aí.[/quote]

Cara obrigado pelo tutorial mas to gritando aki… se liga o problema é o seguinte eu consigo rodar uma class q tem como exemplo q lista as portas do pc ou seja o .jar , dll etc estao no lugar correto, o problema msmo seria em conseguir ler msmo, e ate msmo enviar os comandos, pq a logica da parada é a seguinte neh ??? envia comando ele retorna valores, sendo q eu envio mas na hora de ler a respostas dos meus comando ele nao ta me retornando nada… tem como da uma olhada e me dizer se ta com algum problema sei la…

brigadao …

abracao a todos…

olhando e depurando o codigo, percebi q o retorno do metodo lerdados é NULL alguem sabe dizer pq ???

sabe me informar se ele ta enviando a string q to tentando passar ???

grato…

Poxa ninguem aki nunka fez a comunicao via serial nao ???
grato

[quote=pyro]Olha vc fez a instalação correta? Parece ser isto, experimente acessar esse tutorial http://www.viamais.net/blog/?p=26 fala da API RXTX, muito boa para leitura serial, mas o processo de instalação descrito lá também serve para a Javacomm.
Qualquer coisa grita aí.[/quote]

Pyro você usa a RX-TX?

Primeiramente você tem que “instalar” (copiar para o lugar adequado) o javacomm 2.0 ( a versão 3.0 não é compatível com o windows)
você pode obter em http://wind.lcs.mit.edu/download/java/javacomm20-win32.zip
Ai você irá copiar os arquivos

posteriormente utilize

SComm sc = new SComm("/dev/ttyS2",9600,2000);  // isto está configurado para o linux porta serial 2
//para o windows seria
SComm sc = new SComm("COM2",9600,2000);  //COM 1 , COM 2 depende do teu pc

e mais uma função para enviar Strings (pela porta serial ele envia byte a byte,

	public void sendString(String str) {

		if ((str != null) && (str.length() > 0) && (isOpen())) {
			char[] chars = new char[80];
			str.getChars(0, str.length(), chars, 0);
			 os.write(str.getBytes()); // ou crie uma funcao para enviar direto


		}
	}

//mostra todas portas seriais do pc
	public void getAvailablePorts() throws SerialException {
		Enumeration enum1 = CommPortIdentifier.getPortIdentifiers();
		// Vector list = new Vector();
		// adiciona as portas em um vector
		while (enum1.hasMoreElements()) {
			CommPortIdentifier comId = (CommPortIdentifier) enum1.nextElement();
			if (comId.getPortType() == CommPortIdentifier.PORT_SERIAL) {
				// TODO EXCEPTION
				System.out.println(comId.getName());
			}
			if (jcombo.getItemCount() == 0) {
				throw new SerialException(
						"Serial Port not found, verify the javacomm api or a serial port configurations");
			}

		}

		
	}

espero ter ajudado

abraços

Muito bom Caiortp, depois quero pegar ele e seguir a risca! testar e tudo mais…
Uma dúvida, será que tem como acessar as portas usb no JAVA, mesma coisa que isso abaixo ou nada haver?!

dcbasso,
então ainda não trabalhei com usb,
mas tem um site aqui que pode ter alguma coisa vê se pode te ajudar
http://www.cafeaulait.org/books/javaio2/ioexamples/23/index.html
abraços

também me interessei pela sua curiosidade,
http://javax-usb.org/

mas essa ai de cima , só é funcional para linux

http://www.steelbrothers.ch/jusb/
funciona pra windows acabei de baixar, vou testar

[quote=caiortp]dcbasso,
então ainda não trabalhei com usb,
mas tem um site aqui que pode ter alguma coisa vê se pode te ajudar
http://www.cafeaulait.org/books/javaio2/ioexamples/23/index.html
abraços[/quote]

Página não encontrada!

[quote=caiortp]mas essa ai de cima , só é funcional para linux

http://www.steelbrothers.ch/jusb/
funciona pra windows acabei de baixar, vou testar[/quote]

este funciona para todas plataformas?

Então parece que funciona para linux (apesar que eu não vi nenhum .so) mas as vezes só com jni resolve, para windows funciona, testei o exemplo ele reconheceu pen drive, mouse e teclado usb

Louco mesmo… precisava que ele funcionase em MAC, Linux e Win… principalmente Linux e Win… bom saber… da para bolar umas idéias loucas com ele…

vixe em mac, já fica complicado, a javacomm mesmo, atualmente só funciona para linux, e a 2.0 que funciona para windows, não tem suporte para mac =/

é foda… mas se não… tudo bem! Limito no máximo para windows e Linux… to fazendo um sistema, que preciso fazer a leitura de cartão de memória que pode ser via USB/SERIAL e/ou cartão de memória sd… dai posso limitar… linux e windows via USB/Serial e SD, e MAC somente via SD!

Fera, parte de serial to mexendo bastante, a maior dificuldade minha ta sendo leitura da serial e enviar para a GUI de uma forma mais “elegante” rs… mvc…mvp… presentation model…
apanhando pacas

hehehe… vix eu não cheguei a mexer ainda, mas terei que mexer! Eu tava montagem o projeto do sistema e verificando a parte do Java suportar Serial e USB… briquei uns dias de curioso, mas… quero mexer logo, quando chegar na fase de receber serial vai ser doidera…
Tem um cara que mexe com microcontroladores e etc… nossa, agora com serial e usb dará para fazer mto mto coisa legal… principalmente com USB! hehehe, que até o momente eu só tinha conhecimento de um api paga… dai nem dava animo! hehe
eita vida… quando precisar vou recorrer a voce… uhauhauha vou até pegar seu msn… uhauhauha abraços!

Cara você tem certeza antes de tudo que seu hardware está funcionar corretamente. Você disse que está mandando os comandos, mas você tem certeza que os comandos então chegando no seu harware. Creio que seu problema não esteja nessas classes. Qualquer coisa é só falar que a gente tenta dar uma mão. Putz uma coisa eu achei sacanagem os caras entram aqui não ajudam o cara e ainda desvia do assunto falando de USB.