RXTX - Comunicação Serial - Não consigo rodar como applet

7 respostas
A

Olá,

eu criei um applet para comunicar via serial usando rxtx. Pelo netbeans eu consigo comunicar corretamente com o equipamento serial. Quando eu compilo o jar, assino, e tento chamar a comunicação serial pela página, dá erro.

Segue erro abaixo:

Native lib Version = RXTX-2.1-7
Java lib Version = RXTX-2.1-7
Erro abrindo a comunicação: java.lang.NullPointerException

Já acertei o java.policy para liberar (antes dava erro de permissão de acesso) com o conteúdo:

permission java.lang.RuntimePermission "loadLibrary.rxtxSerial";
permission java.io.FilePermission "${java.home}${/}lib${/}ext${/}x86${/}rxtxSerial.dll", "read";
permission java.util.PropertyPermission "gnu.io.SerialPorts", "read";
permission java.util.PropertyPermission "gnu.io.rxtx.SerialPorts", "read";
permission java.util.PropertyPermission "gnu.io.ParallelPorts", "read";
permission java.util.PropertyPermission "gnu.io.rxtx.ParallelPorts", "read";
permission java.lang.RuntimePermission "modifyThreadGroup";
permission java.lang.RuntimePermission "modifyThread";

Mas não consigo fazer comunicar de jeito nenhum.

Alguma sugestão ?

Abraço a todos.

7 Respostas

J

como você esta carregando sua DLL?
Se da algum erro, post o erro aqui.

A

Acredito que a dll está sendo carregada, pois pus uma copia na pasta %system32% e na mesma pasta do jar.

abraço.

J

Ta mais cade o código do seu applet onde você carrega a DLL.
Tenta carregar dessa forma.

try{
    AccessController.doPrivileged(new PrivilegedAction()
    {
        public Object run()
    {
        try
        {
                    // privileged code goes here, for example:
         System.load("C:/Program Files/.../Mydll.dll");

         return null; // nothing to return
         } 
                 catch (Exception e)
         {
             System.out.println("Unable to load Mydll");
         return null;
         }
    }
     });
} 
    catch (Exception e)
{
        System.out.println("Unable to load Mydll");
}

fonte: http://stackoverflow.com/questions/1713403/calling-a-dll-from-an-applet-via-jni

A

Desculpe a resposta, mas acho que carregar a biblioteca é feito pelo rxtx.jar
Habilitei uns logs aqui, veja como tá o código:

public void AbrirPorta() { try { System.out.println("abrindo porta... 1"); porta = (SerialPort) cp.open("SerialComLeitura", timeout); System.out.println("abrindo porta... 2"); PortaOK = true; //configurar parâmetros System.out.println("abrindo porta... 3"); porta.setSerialPortParams(baudrate, porta.DATABITS_8, porta.STOPBITS_1, porta.PARITY_NONE); System.out.println("abrindo porta... 4"); porta.setFlowControlMode(SerialPort.FLOWCONTROL_NONE); System.out.println("abrindo porta... 5"); } catch (Exception e) { PortaOK = false; System.out.println("Erro abrindo comunicação: " + e); System.exit(1); } }

O applet gera o log até “ABRINDO PORTA… 3”, ou seja: ele dá erro no momento de setar os parametros para a porta serial:

Quando executo pelo netbeans, veja o log que aparece:

Native lib Version = RXTX-2.1-7
Java lib Version = RXTX-2.1-7
abrindo porta… 1
abrindo porta… 2
abrindo porta… 3
abrindo porta… 4
abrindo porta… 5
Iniciando envio de dados…
FLUXO OK!
Enviando um byte para COM1
Enviando : PING
Serial event!
OK
Dados lidos: OK

Abraço!

A

hahahaha
vou te falar o q fiz:

:idea:comentei o código que seta os parametros da serial... E funcionou!
Ou seja: agora é rever o que podemos fazer para acertar essa configuração de velocidade da serial. Acho que isso é que devemos rever...

Veja como ficou:

public void AbrirPorta() {
         try {                        
            System.out.println("abrindo porta... 1");
            porta = (SerialPort) cp.open("SerialComLeitura", timeout);
            System.out.println("abrindo porta... 2");
            PortaOK = true;
            //configurar parâmetros
            System.out.println("abrindo porta... 3");
            
            //porta.setSerialPortParams(baudrate,porta.DATABITS_8,porta.STOPBITS_1,porta.PARITY_NONE);
            System.out.println("abrindo porta... 4");
//            porta.setFlowControlMode(SerialPort.FLOWCONTROL_NONE);
            System.out.println("abrindo porta... 5");
        } catch (Exception e) {
            PortaOK = false;
            System.out.println("Erro abrindo comunicação: " + e);
            System.exit(1);
        }
    }

abraço!!!

D

andsilva81:
Olá,

eu criei um applet para comunicar via serial usando rxtx. Pelo netbeans eu consigo comunicar corretamente com o equipamento serial. Quando eu compilo o jar, assino, e tento chamar a comunicação serial pela página, dá erro.

Segue erro abaixo:

Native lib Version = RXTX-2.1-7
Java lib Version = RXTX-2.1-7
Erro abrindo a comunicação: java.lang.NullPointerException

Já acertei o java.policy para liberar (antes dava erro de permissão de acesso) com o conteúdo:

permission java.lang.RuntimePermission "loadLibrary.rxtxSerial";
permission java.io.FilePermission "${java.home}${/}lib${/}ext${/}x86${/}rxtxSerial.dll", "read";
permission java.util.PropertyPermission "gnu.io.SerialPorts", "read";
permission java.util.PropertyPermission "gnu.io.rxtx.SerialPorts", "read";
permission java.util.PropertyPermission "gnu.io.ParallelPorts", "read";
permission java.util.PropertyPermission "gnu.io.rxtx.ParallelPorts", "read";
permission java.lang.RuntimePermission "modifyThreadGroup";
permission java.lang.RuntimePermission "modifyThread";

Mas não consigo fazer comunicar de jeito nenhum.

Alguma sugestão ?

Abraço a todos.


ola, tudo bem? sou iniciante em java e o meu projeto esta dando erro de “UnsatisfiedLinkError” acredito que pode ser a configuração “VM” vcs poderiam me ajudar a configurar isso?muito obrigado.

C
andsilva81:
Desculpe a resposta, mas acho que carregar a biblioteca é feito pelo rxtx.jar Habilitei uns logs aqui, veja como tá o código:
public void AbrirPorta() {
         try {                        
            System.out.println("abrindo porta... 1");
            porta = (SerialPort) cp.open("SerialComLeitura", timeout);
            System.out.println("abrindo porta... 2");
            PortaOK = true;
            //configurar parâmetros
            System.out.println("abrindo porta... 3");
            porta.setSerialPortParams(baudrate,
                    porta.DATABITS_8,
                    porta.STOPBITS_1,
                    porta.PARITY_NONE);
            System.out.println("abrindo porta... 4");
            porta.setFlowControlMode(SerialPort.FLOWCONTROL_NONE);
            System.out.println("abrindo porta... 5");
        } catch (Exception e) {
            PortaOK = false;
            System.out.println("Erro abrindo comunicação: " + e);
            System.exit(1);
        }
    }

O applet gera o log até "ABRINDO PORTA... 3", ou seja: ele dá erro no momento de setar os parametros para a porta serial:

porta.setSerialPortParams(baudrate,porta.DATABITS_8,porta.STOPBITS_1,porta.PARITY_NONE);

Quando executo pelo netbeans, veja o log que aparece:

Native lib Version = RXTX-2.1-7
Java lib Version = RXTX-2.1-7
abrindo porta... 1
abrindo porta... 2
abrindo porta... 3
abrindo porta... 4
abrindo porta... 5
Iniciando envio de dados...
FLUXO OK!
Enviando um byte para COM1
Enviando : PING
Serial event!
OK
Dados lidos: OK

Abraço!

Boa Tarde andsilva81!

Creio que estou utilizando o mesmo código que você para comunicar com a porta serial.
Não estou conseguindo obter resposta do dispositivo, que no meu caso seria um modem 3g.

Ele aparece:

Native lib Version = RXTX-2.1-7
Java lib Version = RXTX-2.1-7
FLUXO OK!
Enviando um byte para COM3
Enviando : AT+CFUN?

Depois disso ele trava

Eu estou chamando este código para enviar
public void EnviarUmaString(String msg) {
        HabilitarEscrita();
        ObterIdDaPorta();
        AbrirPorta();

        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());
                saida.close();
                HabilitarLeitura();
                LerDados();
                
                Thread.sleep(4000);
                FecharCom();
//                saida.flush();
            } catch (Exception e) {
                System.out.println("Houve um erro durante o envio. ");
                System.out.println("STATUS: " + e);
                e.printStackTrace();
                System.exit(1);
            }
        } else {
            System.exit(1);
        }
    }

Pode me dar uma ajuda?

Criado 17 de abril de 2013
Ultima resposta 9 de jul. de 2014
Respostas 7
Participantes 4