JavaComm[Resolvido]

8 respostas
soned

Saudações…
estou implementando a comunicação serial no java usando a JavaComm. Muito bem, fiz um trecho de código só pra me listar as portas disponíveis. Quando executo o programa pela IDE do NetBeans não aparece as portas. Porém, se executo pelo prompt, funciona normalmente.
Alguém o porque disso?

8 Respostas

laudenpower

Se possível mostre o código que você fez, assim a gente pode avaliar melhor :slight_smile:
Outra coisa, o javacomm trabalha com um arquivo onde você informar as portas seriais existentes no computador, pode ser que pelo console o programa esteja acessando um arquivo com os nomes das portas listados de forma correta enquanto no netbeans o programa esteja acessando outro arquivo que não tenha sido configurado corretamente. Em todo caso posta o código ai pra gente ver, que ai as coisas fica mais fáceis.

soned

ok amigo, segue o trecho abaixo:

public class SerialCom {
    private String[] portas;
    private Enumeration listaDePortas;

    public SerialCom() {
        listaDePortas = CommPortIdentifier.getPortIdentifiers();
    }

    public void ListarPortas(){
        int i = 0;
        portas = new String[10];
        while (listaDePortas.hasMoreElements()) {
            CommPortIdentifier ips = (CommPortIdentifier)listaDePortas.nextElement();
            portas[i] = ips.getName();
            i++;
        }
    }

    public void ImprimePortas(){
        for (int i = 0; i < portas.length; i++) {
            if (portas[i] != null) {
                System.out.print(portas[i] + " ");
            }
        }
        System.out.println("");
    } 
}
ViniGodoy

Geralmente isso ocorre quando a dll do javax.comm não é encontrada.

Outro problema (que não deve ter a ver com seu caso, mas vc provavelmente vai esbarrar) é que essa lista de portas só é obtida durante a inicialização. Se uma nova porta surgir no sistema, ela nunca será detectada. Antes que você tenha esse problema, já criei um método que faz o refresh das portas. Ele usa reflection para chamar um método privado, portanto, seu funcionamento pode parar de existir entre versões diferentes do javax.comm. Mas usei por vários anos e nunca tive problemas:

/**
     * Refreshes the port list, redetect all system ports. It's desirable that
     * all <tt>CommPorts</tt> objects are closed before calling
     * refreshing.
     */
    public static void refreshComPorts() {
        try { // try reloading the driver
            Field masterIdList_Field = CommPortIdentifier.class.getDeclaredField("masterIdList");
            masterIdList_Field.setAccessible(true);
            masterIdList_Field.set(null, null);

            String temp_string = System.getProperty("java.home")
                    + File.separator + "lib" + File.separator
                    + "javax.comm.properties";
            Method loadDriver_Method = CommPortIdentifier.class.getDeclaredMethod(
                    "loadDriver", new Class[] {String.class});
            loadDriver_Method.setAccessible(true); // unprotect it
            loadDriver_Method.invoke(null, new Object[] {temp_string});
        } catch (Exception e) {
             //Faça seu log aqui, removi o código do meu
        }
    }
soned

então, eu copiei os arquivos para os seguintes locais:

win32com.dll —> C:\Arquivos de programas\Java\jre6\bin
javax.comm.properties --> C:\Arquivos de programas\Java\jre6\lib
comm.jar --> C:\Arquivos de programas\Java\jre6\lib\ext

é assim q vc distribuiu os arquivos?

laudenpower

Apenas por curiosidade, você experimentou a biblioteca rxtxcomm? Essa biblioteca tem sido usada de forma “oficial” quando se fala de porta serial (nesse caso também trabalha com porta paralela), sendo ela de configuração mais simples que a Javacomm e com uma quantidade de SO’s suportados mais ampla que o Javacomm (nesse caso tem até para mac enquanto a Javacomm da suporte apenas para linux, sem suporte para win).
O caso que o viny descreveu é real caso você tenha conversores de usb sendo instalados no computador durante o tempo de execução do seu programa.

ViniGodoy

Não. Geralmente eu mexo na própria configuração do projeto, explicitamente.
Até pq fica mais fácil de distribuir o executável depois.

Como fiz a configuração em Eclipse, não saberia te orientar exatamente como proceder para o netbeans.

ViniGodoy

Era o que ocorria comigo.

soned

olá amigos…
eu fiz o teste com a RxTxCom, e com ela eu consegui ver as portas pela IDE do Netbeans. Acho que vou usar ela ao invéz da JavaComm. Vlw pelas dicas

Criado 5 de julho de 2010
Ultima resposta 5 de jul. de 2010
Respostas 8
Participantes 3