Problemas em ler dados na porta serial

38 respostas
P

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();
        }  
             
    }
}

38 Respostas

P

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

P

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

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…

P

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…

P

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

D

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

Pyro você usa a RX-TX?

C

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

D

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

C

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

C

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

C

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

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

D

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

Página não encontrada!

D

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

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

este funciona para todas plataformas?

C

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

D

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…

C

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 =/

D

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

C

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

D

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!

P

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.

D

eim, acho que achei um erro no código do programa, confiram ae:

[color=red]ERRO:[/color]

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 ); } } }

[color=red]CERTO:[/color]

public void LerDados(){ if (Leitura == 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 ); } } }

Observem a 2 linha… ele esta comparando a boolean errada… a escrita no lugar da leitura da porta serial… será que isso pode indicar um erro?!

D

Outra coisa que não entendi, é como utilizar o metodo:

public void serialEvent(SerialPortEvent ev){ ... }

infelizmente ele parece estar meio perdido ae no meio… eu tbm estou com problemas… e meu “acessrio” esta funfando… estou usando um GPS na porta COM e ele esta mandando normalmente os dados… mas no java no metodo… “LerDados” ele não esta recebendo nada… o “system.out.println(pSerial.Dadoslidos);” sempre dá como null!!!

P

Cara a primeira coisa que eu recomendo você fazer, é um programinha pra listar as portas. Tenta isso pelo menos se você não conseguir torne a postar aqui que a gente dá uma mão.

D

meu filho, isso ja esta feito, ele abre as portas e manda… que mais de informa util voce pode me dar?

Ele não recebe, esta com problema nas linhas de codigo no artigo do GUJ!

P

meu filho, isso ja esta feito, ele abre as portas e manda… que mais de informa util voce pode me dar?
Ele não recebe, esta com problema nas linhas de codigo no artigo do GUJ!

hahahahahhaah tem pessoas que além de não ajudar só atrapalham, cara quem é você pra me dizer isso.

Se você parasse pra prestar atenção no que você diz você não ia dizer certas asneiras. Então acho que primeiramente você deve prestar atenção antes de falar dos outros. A minha intenção aqui era ajudar mas pelo jeito tem pessoas aqui que sabe de tudo então deixo na mão do dcbasso resolver isso já que ele é o gostosão, e só pra terminar, amigo eu já fiz projetos usando a porta serial e não preciso de ninguem pra me dizer o que é certo ou o que é errado, ao contrarío de você que não sabe e ainda fica atrapalhando, e pra terminar quando eu fiz essas paradas eu dei uma pequena orientada no artigo aqui do guj sobre isso e não vi erro nenhum.

D

falou então super heavy metal 666…

P

tanks

D

derds…
cara, então vamos parar de “putaria” E ir para o que relamente interessa…
acho que eu a besteira que falei… mas aquele erro de código, “if (leitura…” ou “if (escrita…” aquilo ta certo mesmo?
Por o metodo eh para ler Dados da Porta Serial, e ele faz um if com se esta habilitado para Escrita… entendeu? isso ta certo?

C
public void serialEvent(SerialPortEvent evt) {

		
		switch (evt.getEventType()) {
		
		case SerialPortEvent.DATA_AVAILABLE:
			
			try {
				while (is.available() > 0) {
					System.out.println(is.read());
					}
					

				}
			} catch (IOException e) {
				System.out.println("ERROR ON RECEIVE DATA");
				
				return;
			}

		}

:smiley:

D

Pessoal, fiquei sabendo que a familia NT tem um certo problema com I/Os portanto vai ae:

Muitas pessoas tem problema para acessar a porta serial do seu PC quando utilizam a Familia Windows NT (Inclui NT/XP e 2000), e por esta razão estou colocando a disposição um tutorial de como resolver tal problema:

Em DOS nós temos a liberdade de acessar dispositivos do sistema (Hardware), mas com a chegada da familia NT perdemos um pouco desta liberdade e devemos utilizar um DRIVER para acessar estes dispositivos, e para tanto, quando falamos de porta serial, muitas vocês pode ser necessário utilizar o driver para acessar/utilizar a porta serial. Este problema pode ser contornado utilizado o UserPort (Baixe aqui).

Instalação:

Extraia os arquivos e copie o arquivo userport.sys para: “c:\Windows\System32\Drivers”, após isto executa o arquivo userport.exe de onde você poderá colocar endereços nos quais você deseja ter um acesso direto. Após fazer a seleção de endereços, basta clicar em RUN, e está tudo pronto, algumas vezes se faz necessário reiniciar o sistema.

Eu pessoalmente não testei, mas um colega meu fez e realmente deu certo! Recomendo fazer uma cópia/Backup do sistema para sua segurança!

Abraços a todos,

C

No Vista,XP,98,95(esses já testei) é só copiar os arquivos do javacomm2.0
win32com.dll para a pasta \bin (da pasta da maquina virtual)
e os arquivos javax.comm.properties e comm.jar para \lib (idem)
que tá tudo resolvido

R

Pessoal, estou com o mesmo problema, esta instalado certo a RxTx, pois enviar dados pela serial consigo, só não estou conseguindo receber, e os dados chegam pois fico monitorando pelo TeraTerm o fluxo.

Alguém sabe o que está faltando no código, utilizei o mesmo do tutorial, aquele que contém o método LerDados().

vlw !!

P

Experimenta dar uma olhada aqui http://www.viamais.net/blog/index.php?s=rxtx, talvez ajude vc na leitura.

R

Depois de alterar e fazer varios testes no programa, consegui fazer entrar no evento que não estava entrando. O tipo que está enviando é OUTPUT_BUFFER_EMPTY, alguém sabe o por que :?:

P

Posta o seu código ou me fala se vc está usando o exemplo do artigo do GUJ ou do link que lhe indiquei.

R

Tá ai meu código.

package terminal;

import gnu.io.*;
import java.io.*;
import java.util.Enumeration;
import java.util.TooManyListenersException;
import java.util.Vector;

/**
 *
 * @author Rafael
 */
public class RS232 implements Runnable, SerialPortEventListener {

    private int baudrate = 115200;
    private int timeout = 10;
    private CommPortIdentifier cp;
    private SerialPort serial;
    private OutputStream saida;
    private InputStream entrada;    
    private String porta="COM1";
    private Thread threadLeitura;
    public static frmPrincipal principal;
        
    public String buffer="";

    public RS232(){
        
    }    
       
    public String getPorta(){
        return porta;
    }
            
    public void setPorta(String porta){
        this.porta = porta;
    }
    
    public void Fechar(){
        
        try{
            if(entrada != null)
                entrada.close();

            if(saida != null)
                saida.close();

            if(serial != null)
                serial.close();
            
        }catch(IOException e){
            
        }
        
    }
    
    public Vector ListarPortas(){  
         int i = 0;  
         Enumeration listaDePortas = CommPortIdentifier.getPortIdentifiers();  
         Vector portas = new Vector();

         while (listaDePortas.hasMoreElements()) {  
             CommPortIdentifier ips = (CommPortIdentifier)listaDePortas.nextElement();  
             portas.addElement(ips.getName());         
             i++;
         }
         return portas;
    }  
    
    public void serialEvent(SerialPortEvent ev){       
        Mensagem("SERIAL EVENTO***"+ev.getEventType()+"\n");
                       
        switch (ev.getEventType()) {            
            case SerialPortEvent.BI:
                Mensagem("BI***\n");
                break;
            case SerialPortEvent.CD:
                Mensagem("CD***\n");
                break;
            case SerialPortEvent.CTS:    
                Mensagem("CTS***\n");
                break;
            case SerialPortEvent.DSR:
                Mensagem("DSR***\n");
                break;
            case SerialPortEvent.FE:    
                Mensagem("FE***\n");
                break;
            case SerialPortEvent.OE:
                Mensagem("OE***\n");
                break;
            case SerialPortEvent.OUTPUT_BUFFER_EMPTY:
                Mensagem("EMPTY***\n");
                break;
            case SerialPortEvent.PE:
                Mensagem("PE***\n");
                break;
            case SerialPortEvent.RI:
                Mensagem("RI***\n");
                break;
            case SerialPortEvent.DATA_AVAILABLE:
                Mensagem("EVENTO AVAIABLE***\n");
                 // we get here if data has been received
                 
                 try {
                    if(entrada.available()==0){
                        Mensagem("SEM DADOS***\n");
                        return;
                    }

                    byte[] readBuffer = new byte[entrada.available()];

                    String result  = new String(readBuffer);
                    System.out.println("Read: "+result);
                 } catch (IOException e) {}
            break;
        }
    }
    
    public byte readByteP(){

          int temp, TIMEOUT = 2000;
          long time=System.currentTimeMillis();
          byte valor = 0;
          
          try{
              while ((temp=entrada.available())<=0){
                  if ((System.currentTimeMillis()-time)>TIMEOUT)
                        return valor;
              }
              
              valor = (byte)entrada.read();
          
          }catch(IOException e){
          }

          return (byte)valor;    
    }

    public boolean AbrirPorta(){
        try {
                                                            
            cp = CommPortIdentifier.getPortIdentifier(porta);                        
            serial = (SerialPort)cp.open(porta, timeout);
                                    
            serial.setSerialPortParams(baudrate,
            serial.DATABITS_8,
            serial.STOPBITS_1,
            serial.PARITY_NONE);
            
            serial.setFlowControlMode(SerialPort.FLOWCONTROL_NONE);
            
            saida = serial.getOutputStream();
                        
            entrada = serial.getInputStream();
            
            serial.addEventListener(this);
            
            serial.notifyOnDataAvailable(true);
            
            threadLeitura = new Thread(this);
            threadLeitura.start();
            
            //serial.notifyOnOutputEmpty(true);
                         
            Mensagem("=> OK...\n");
            
            return true;
        } catch (Exception e) {
            Mensagem("Erro: "+e);
            return false;
        }
    }
        
    public void Mensagem(String msg){
        System.out.println(msg);
    }
        
    public void delay_ms(int tempo){
        try{
            Thread.sleep(tempo);
        }catch(Exception e){}
        
    }
    
    public void delay_s(int tempo){
        try{
            Thread.sleep(tempo*1000);
        }catch(Exception e){}
        
    }
    
    public byte[] Recebe(){
        
        try{
            
            delay_ms(10);
                                    
            if(entrada.available()==0)
                return null;
            
            int total = entrada.available();
            
            byte[] dados = new byte[total];
            
            while(total>0){
                entrada.read(dados);
                total -= dados.length;
            }
            
            return dados;
            
        }catch(Exception e){
            Mensagem("Erro Recebe => "+e);
            return null;
        }
        
    }
    
    public void Envia(String valor){        
        Mensagem("Enviando: "+valor+"\n");
        valor += "\r\n";        
        Envia(valor.getBytes());
    }
    
    public void Envia(byte[] valor){
        try{
            saida.write(valor,0,valor.length);            
        }catch(Exception e){
            Mensagem("Erro ao enviar: "+e);
        }
    }

    public void run(){        
        try {
           Thread.sleep(5);
        }catch (Exception e) {}
    }  
}
P
  • Os parâmetros estão todos corretos?
  • Vc leu o link que passei anteriormente?
R

Os parametros estão corretos sim.
Teve um momento em que deixei o terminal aberto e uma mensagem chegou, mas foi a unica que apareceu, depois não apareceu mais.

  • Você sabe se a biblioteca Comm Api pode causar conflito?

  • Eu li o link que você passou sim, executei todas instruções, mas mesmo assim não consigo receber dados.

  • Outra coisa, no link que você mandou está JAVAHOME o nome da váriavel, mas aqui esta JAVA_HOME, será que essa diferença pode estar causando essa falha no recebimento?

R

Pessoal resolvi meu problema, achei uma versão da Comm API para linux, agora está funcionando nas duas plataformas.

Grato !!

Criado 1 de outubro de 2007
Ultima resposta 18 de fev. de 2008
Respostas 38
Participantes 6