Comunicação Porta Serial

7 respostas
D

Estou tendo um probleminha na porta de comunicação serial…
Eu consigo listar as portas, só q naum consigo fazer um open

cp = CommPortIdentifier.getPortIdentifier(Porta); // Pega o id da porta porta = (SerialPort) cp.open("PortSerial", timeout); // abre a porta
nesta segunda linha q esta acontecendo um erro, como segue abaixo:
   javax.comm.PortInUseException: Port currently owned by Unknown Windows Application

OBs.: estou pegando a lista de portas com esse comando
Enumeration portas= CommPortIdentifier.getPortIdentifiers();

Naum sei, mas estou achando q ele esta trazendo as portas que estao em uso já… gostaria de saber se tem como listar alguma porta sem uso??
acho q deve ser isso que esta causando erro…

desde já agradeço
Thiago

7 Respostas

R

Cara, tbm tive um monte de problemas com comunicação serial, peguei uma classe praticamente pronta aki numa apostilado guj e consegui fazer ela funcionar, segue o codigo:

import java.util.Enumeration;
import javax.comm.*;
import java.io.*;

/**
 *
 * @author Rafael
 */

//classe Principal
public class SComm implements Runnable, SerialPortEventListener {
    //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 String informacao;
    private Thread threadLeitura;
    //indicadores
    private boolean IDPortaOK; //true porta EXISTE
    private boolean PortaOK;// true porta aberta
    private boolean Leitura;
    private boolean Escrita;
    
    private principal pri;
    //construtor default paridade : par
    //baudrate: 9600 bps stopbits: 2 COM 1
    public SComm() {
        //pri = new principal();
        Porta = "COM1";
        baudrate = 9600;
        timeout = 1000;
        //System.out.println("Entrei no construtor");
    };
    //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);
            System.out.println(cp + "  " + 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 (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 );
            }
        }
    }

    //método RUN da thread de leitura
    public void run(){
        try {
            Thread.sleep(2000);
        } 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[8];
            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);
                    //System.out.println("Rafael " + Dadoslidos.substring(0,2));
                    if(Dadoslidos.substring(0,2).equals(new String("00"))){
                        System.out.println("entrei");
                        pri.atualizaInfo(Dadoslidos.substring(0,2), "velVento");
                        System.out.println("passei");
                    }
                }
               
            } catch (Exception e) {
                System.out.println("Erro durante a leitura: " + e );
            }
            
            /*if(Dadoslidos.substring(1,3) == "dir"){
                pri.atualizaInfo(Dadoslidos.substring(4,4), "dirVento");
            }
            
            if(Dadoslidos.substring(1,3) == "ven"){
                pri.atualizaInfo(Dadoslidos.substring(4,5), "velVento");
            }
            
            if(Dadoslidos.substring(1,3) == "vel"){
                //pri.atualizaInfo(Dadoslidos.substring(4,6), "velObjeto");
                System.out.println("Entrei onde naum era pra entrar");
            }*/
            
            
            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;
    }
}

Da tanto pra vc fazer a leitura como escrita.

Se naum conseguir me de um toque.

Falow

D

OPa!! valeussss… mesmo… essa classe funcionou direitinho…
o engraçado q esta quase igual a minha q tinha feito… mas tudo bem

Brigaduuu

fllwssss

B

Alguem me pode ajudar??

Tou me iniciando nestas andanças de java e jcomm e ainda não domino muito :frowning:

Tou tentando este seu exemplo mas ta ma dar erro:
"java.lang.NoSuchMethodError: main
Exception in thread “main” "

Acho k falta o main alguem me pode indicar um para este caso?? Please!!!

Muito Obrigado

B

Tou testando uns exemplos do tutorial de java api comm. e quando no codigo coloco:

listaDePortas = CommPortIdentifier.getPortIdentifiers();
System.out.println(“FHJK:” +listaDePortas);

da me o seguinte erro:

“javax.comm.CommPortEnumerator@e7b241”

Alguem me pode ajudar!!

Muito Obrigado

B

Ola!Tou testando esse exemplo e da me o seguinte erro:

“Scomm.java”: class SComm is public, should be declared in a file named SComm.java at line 23, column 1

k diz respeito a seguinte linha: " private principal pri;"

Alguem pode me ajudar?? Please

A

BrunoNave:
Alguem me pode ajudar??

Tou me iniciando nestas andanças de java e jcomm e ainda não domino muito :frowning:

Tou tentando este seu exemplo mas ta ma dar erro:
"java.lang.NoSuchMethodError: main
Exception in thread “main” "

Acho k falta o main alguem me pode indicar um para este caso?? Please!!!

Muito Obrigado

Realmente essa duvida eh bem basica :slight_smile:

Quando vc coloca um programa pra rodar em java ele procura a main do arquivo, e esse ai nao tem main.
Pra resolver esse problema adicione no codigo esse fragmento, antes de fechar a ultima chave:

public static void main(String[] args) {

new SComm();

}

depois tem que ver se tem mesmo um dispositivo conectado na com1, senao nao vai funcionar.

BrunoNave:
Ola!Tou testando esse exemplo e da me o seguinte erro:

“Scomm.java”: class SComm is public, should be declared in a file named SComm.java at line 23, column 1

k diz respeito a seguinte linha: " private principal pri;"

Alguem pode me ajudar?? Please

em java a classe principal tem que ter o mesmo nome que o arquivo.
Se o nome do arquivo for MeuNome, o nome do arquivo q a contem deve ser MeuNome.java

P

Dá uma entrada aqui, tem muito coisa sobre comunicação serial utilizando a API RXTX: http://www.viamais.net/blog/index.php?s=rxtx.
Só um detalhe: a apostila do Guj é realmente excelente, contudo na leitura de alguns equipamentos o código postado lá quebra as strings causando certo transtorno. Os exemplos do blog que indiquei não dá esses problemas.

Criado 20 de outubro de 2007
Ultima resposta 5 de ago. de 2008
Respostas 7
Participantes 5