Porta Serial

8 respostas
robinsonbsilva

Boas!!

Eu preciso de uma ajuda em relação ao erro:
Error loading win32com: java.lang.UnsatisfiedLinkError: no win32com in java.library.path

Todos os passos de instalação da DLL, e dos restantes dos arquivos foram cautelosamente feitos, mas na hora de rodar o programa, a mensagem acima é apresentada!!!

Agradeço desde já!

8 Respostas

D

E aí robinsonbsilva para solucionar este problema eu tive de baixar o j2re-1_4_2_04-windows-i586-p.exe e instalá-lo na máquina. Ao instalá-lo ele cria automaticamente a pasta Java dentro de Arquivos de Programas. Aí basta você colocar os arquivos que acompanham a API javacomm da Sun que são o comm.jar e javax.comm.properties dentro de C:\Arquivos de programas\Java\j2re1.4.2_04\lib. E o arquivo win32com.dll dentro de C:\Arquivos de programas\Java\j2re1.4.2_04\bin que com certeza irá funcionar.

Qualquer coisa se você tiver interesse pelo assunto de comunicação serial e paralela via Java acessa o site do Daniel Vasconcelos que lá encontrarás muitas informações. O site é
http://www.geocities.com/danielvg.geo/codigo.html

robinsonbsilva

DouglasCar:
E aí robinsonbsilva para solucionar este problema eu tive de baixar o j2re-1_4_2_04-windows-i586-p.exe e instalá-lo na máquina. Ao instalá-lo ele cria automaticamente a pasta Java dentro de Arquivos de Programas. Aí basta você colocar os arquivos que acompanham a API javacomm da Sun que são o comm.jar e javax.comm.properties dentro de C:\Arquivos de programas\Java\j2re1.4.2_04\lib. E o arquivo win32com.dll dentro de C:\Arquivos de programas\Java\j2re1.4.2_04\bin que com certeza irá funcionar.

Qualquer coisa se você tiver interesse pelo assunto de comunicação serial e paralela via Java acessa o site do Daniel Vasconcelos que lá encontrarás muitas informações. O site é
http://www.geocities.com/danielvg.geo/codigo.html

Valeu !!! Vc não imagina como eu estava ficando angustiado por isso!!!
Agora vou testar!!!

Até!

robinsonbsilva

DouglasCar:
E aí robinsonbsilva para solucionar este problema eu tive de baixar o j2re-1_4_2_04-windows-i586-p.exe e instalá-lo na máquina. Ao instalá-lo ele cria automaticamente a pasta Java dentro de Arquivos de Programas. Aí basta você colocar os arquivos que acompanham a API javacomm da Sun que são o comm.jar e javax.comm.properties dentro de C:\Arquivos de programas\Java\j2re1.4.2_04\lib. E o arquivo win32com.dll dentro de C:\Arquivos de programas\Java\j2re1.4.2_04\bin que com certeza irá funcionar.

Qualquer coisa se você tiver interesse pelo assunto de comunicação serial e paralela via Java acessa o site do Daniel Vasconcelos que lá encontrarás muitas informações. O site é
http://www.geocities.com/danielvg.geo/codigo.html

Boas!!

Fazendo essa modificações no JRE. rolou!Agora o problema que eu tenho é o seguinte, quando eu executo o mesmo programa, aí por exemplo peço para listar as portas, a mensagem a seguir é exibida(Error loading win32com: java.lang.UnsatisfiedLinkError: no win32com in java.library.path), agora se eu dou um Alt + F5 no netbeans(Debugar) esse errro já não ocorre, e as portas são listadas!!!
Fiz testes com threads, mas o mesmo continuou!!!Vc tem alguma idéia??

Grato!

D

Cara eu estou te mandando em anexo um programa para reconhecer as portas do micro.

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

public class ListPorts {
  public static void main(String args[]) {
    Enumeration ports = 
      CommPortIdentifier.getPortIdentifiers();
    while (ports.hasMoreElements()) {
      CommPortIdentifier port = 
        (CommPortIdentifier)ports.nextElement();
      String type;
      switch (port.getPortType()) {
        case CommPortIdentifier.PORT_PARALLEL:
          type = "Parallel"; 
          break;
        case CommPortIdentifier.PORT_SERIAL:
          type = "Serial"; 
          break;
        default:  /// Shouldn't happen
          type = "Unknown"; 
          break;
      }
      System.out.println(port.getName() + ": " + type);
    }
  }
}
Dá uma testada para ver se funciona. Eu utilizo o eclipse e consigo importar o comm.jar para o buidpath do mesmo e funciona sem problemas. Caso este programa não funcione me mande o erro que está aparecendo para você. Abraço!
robinsonbsilva
DouglasCar:
Cara eu estou te mandando em anexo um programa para reconhecer as portas do micro.
import javax.comm.*;
import java.util.Enumeration;

public class ListPorts {
  public static void main(String args[]) {
    Enumeration ports = 
      CommPortIdentifier.getPortIdentifiers();
    while (ports.hasMoreElements()) {
      CommPortIdentifier port = 
        (CommPortIdentifier)ports.nextElement();
      String type;
      switch (port.getPortType()) {
        case CommPortIdentifier.PORT_PARALLEL:
          type = "Parallel"; 
          break;
        case CommPortIdentifier.PORT_SERIAL:
          type = "Serial"; 
          break;
        default:  /// Shouldn't happen
          type = "Unknown"; 
          break;
      }
      System.out.println(port.getName() + ": " + type);
    }
  }
}
Dá uma testada para ver se funciona. Eu utilizo o eclipse e consigo importar o comm.jar para o buidpath do mesmo e funciona sem problemas. Caso este programa não funcione me mande o erro que está aparecendo para você. Abraço!

Olá!!

Olha eu de novo pertubando a todos!!
Agora, o problema é outro! Na hora que eu tento abrir a porta serial(COM1) ele apresenta o seguinte erro:

Erro ao abrir a porta: COM1 ! STATUS:java.lang.NullPointerException

D

Só para deixar mais claro, este erro ocorre quando tentas rodar o programa que te mandei ontem. Se não manda em anexo o programa no qual este errro acontece.

robinsonbsilva

//////////////////////////////////////////////////////////////////////////////////////
//// ////////////////Classe que lê e envia dados a Serial
/////////////////////////////////////////////////////////////////////////////////////

import javax.comm.;
import java.io.
;

public class SComm implements Runnable, SerialPortEventListener {

public String Dadoslidos;
public int nodeBytes;
private String Porta;
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(String p) {
    Porta = p;
    baudrate = 9500;
    timeout = 2000;
};

//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.out.println("Erro ao obter id da porta");
        }
        IDPortaOK = true;
    }
    catch (Exception e) {
        System.out.println("Erro durante o procedimento. STATUS" + e );
        IDPortaOK = false;
        System.out.println("Erro ao obter id da porta");
    }
}

//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:  " + Porta + " ! STATUS:" + e );
    }
}

//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 );
        }
    }
    else {
        System.out.println("Erro ao enviar!");
    }
}

//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.out.println("Erro ao ler");
        }
        
        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.out.println("Erro ao ler");
        }
        porta.notifyOnDataAvailable(true);
        
        try {
            threadLeitura = new Thread(this);
            threadLeitura.start();
        }
        catch (Exception e) {
            System.out.println("Erro ao iniciar leitura: " + e );
        }
    }
}

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.out.println("Erro ao fechar");
    }
}

//Acessores
public String getObterPorta(){
    return Porta;
}

public int getObterBaudrate(){
    return baudrate;
}

}

//////////////////////////////////////////////////////////////////////////////////////
//// ////////////////Classe que apenas reconhece as portas disponíveis
/////////////////////////////////////////////////////////////////////////////////////

import javax.comm.<em>;

import <a href="http://java.io">java.io</a>.</em>;

import java.util.*;

public class SerialCom {

//variáveis para identificar portas
protected String[] portas;
protected Enumeration listaDePortas;

//construtor
public SerialCom(){
    try{
        listaDePortas = CommPortIdentifier.getPortIdentifiers();
        carregarPortas();
    }
    catch(Exception e){
        System.out.println("Erro 0 -> " + e.getMessage());
    }
}

//Copia portas para um Array
protected void carregarPortas() {
    try{
        int i = 0;
        portas = new String[10];
        while (listaDePortas.hasMoreElements()) {
            CommPortIdentifier ips = (CommPortIdentifier)listaDePortas.nextElement();
            portas[i] = ips.getName();
            i++;
        }
    }
    catch(Exception e){
        System.out.println("Erro 1 -> " + e.getMessage());
    }
}

//pesquisa se a Porta existe
public boolean portaExiste(String COMp){
    
    boolean ex = false;
    
    try{
        String temp;
        
        while (listaDePortas.hasMoreElements()) {
            CommPortIdentifier ips = (CommPortIdentifier)listaDePortas.nextElement();
            temp = ips.getName();
            if (temp.equals(COMp)== true) {
                ex = true;
            };
        }
        return ex;
    }
    catch(Exception e){
        System.out.println("Erro 2 -> " + e.getMessage());
    }
    return ex;
}

//imprime as portas disponíveis
protected void imprimePortas(){
    
    try{
        carregarPortas();
        for (int i = 0 ; i < portas.length ; i ++ ) {
            if (portas[i] != null ) {
                System.out.println(portas[i] + " ");
            }
        }
        System.out.println(" ");
    }
    catch(Exception e){
        System.out.println("Erro 3 -> " + e.getMessage());
    }
    
}

//retorna as portas disponíveis
public String[] getObterPortas(){
    return portas;
}

}

//////////////////////////////////////////////////////////////////////////////////////
///As classes são instânciadas em uma tela ABAIXO
//////////////////////////////////////////////////////////////////////////////////////

public class Serial extends javax.swing.JFrame {

/** Creates new form Seial */
public Serial() {
    initComponents();
    carregaPortas();
}

private void initComponents() {
    cmdSair = new javax.swing.JButton();
    pnlPortas = new javax.swing.JPanel();
    cboPortas = new javax.swing.JComboBox();
    jPanel1 = new javax.swing.JPanel();
    scroll1 = new javax.swing.JScrollPane();
    txtDados = new javax.swing.JTextArea();
    cmdLer = new javax.swing.JButton();

    getContentPane().setLayout(null);

    setTitle("Verificar Portas");
    setFont(new java.awt.Font("Verdana", 0, 10));
    setResizable(false);
    addWindowListener(new java.awt.event.WindowAdapter() {
        public void windowClosing(java.awt.event.WindowEvent evt) {
            exitForm(evt);
        }
    });

    cmdSair.setFont(new java.awt.Font("Verdana", 0, 10));
    cmdSair.setText("Sair");
    cmdSair.setToolTipText("Sair");
    cmdSair.setPreferredSize(new java.awt.Dimension(250, 210));
    cmdSair.addActionListener(new java.awt.event.ActionListener() {
        public void actionPerformed(java.awt.event.ActionEvent evt) {
            cmdSairActionPerformed(evt);
        }
    });

    getContentPane().add(cmdSair);
    cmdSair.setBounds(10, 300, 250, 25);

    pnlPortas.setLayout(null);

    pnlPortas.setBorder(new javax.swing.border.TitledBorder(null, "Portas Dispon\u00edveis", javax.swing.border.TitledBorder.DEFAULT_JUSTIFICATION, javax.swing.border.TitledBorder.DEFAULT_POSITION, new java.awt.Font("Verdana", 0, 10)));
    pnlPortas.setFont(new java.awt.Font("Verdana", 0, 10));
    cboPortas.setFont(new java.awt.Font("Verdana", 0, 10));
    pnlPortas.add(cboPortas);
    cboPortas.setBounds(10, 20, 230, 21);

    getContentPane().add(pnlPortas);
    pnlPortas.setBounds(10, 10, 250, 60);

    jPanel1.setLayout(null);

    jPanel1.setBorder(new javax.swing.border.TitledBorder(null, "Ler Chip", javax.swing.border.TitledBorder.DEFAULT_JUSTIFICATION, javax.swing.border.TitledBorder.DEFAULT_POSITION, new java.awt.Font("Verdana", 0, 10)));
    jPanel1.setFont(new java.awt.Font("Verdana", 0, 10));
    jPanel1.setPreferredSize(new java.awt.Dimension(250, 210));
    scroll1.setFont(new java.awt.Font("Verdana", 0, 10));
    txtDados.setColumns(20);
    txtDados.setEditable(false);
    txtDados.setRows(8);
    scroll1.setViewportView(txtDados);

    jPanel1.add(scroll1);
    scroll1.setBounds(10, 20, 230, 140);

    cmdLer.setFont(new java.awt.Font("Verdana", 0, 10));
    cmdLer.setText("Ler");
    cmdLer.setToolTipText("Sair");
    cmdLer.setPreferredSize(new java.awt.Dimension(77, 25));
    cmdLer.addActionListener(new java.awt.event.ActionListener() {
        public void actionPerformed(java.awt.event.ActionEvent evt) {
            cmdLerActionPerformed(evt);
        }
    });

    jPanel1.add(cmdLer);
    cmdLer.setBounds(10, 170, 90, 25);

    getContentPane().add(jPanel1);
    jPanel1.setBounds(10, 80, 250, 210);

    java.awt.Dimension screenSize = java.awt.Toolkit.getDefaultToolkit().getScreenSize();
    setBounds((screenSize.width-277)/2, (screenSize.height-370)/2, 277, 370);
}

private void cmdLerActionPerformed(java.awt.event.ActionEvent evt) {
    ler();
}

private void cmdSairActionPerformed(java.awt.event.ActionEvent evt) {
    System.exit(0);
}
    
private void exitForm(java.awt.event.WindowEvent evt) {
    System.exit(0);
}

public static void main(String args[]) {
    new Serial().show();
}

// Variables declaration - do not modify
private javax.swing.JComboBox cboPortas;
private javax.swing.JButton cmdLer;
private javax.swing.JButton cmdSair;
private javax.swing.JPanel jPanel1;
private javax.swing.JPanel pnlPortas;
private javax.swing.JScrollPane scroll1;
private javax.swing.JTextArea txtDados;
// End of variables declaration

private void carregaPortas(){
    try{

        SerialCom serial = new SerialCom();
        String port[] = serial.getObterPortas();
        
        for (int i = 0 ; i < port.length ; i ++ ) {
            if (port[i] != null ) {
               cboPortas.addItem(serial.portas[i]);
            }
        }  
    }
    catch(Exception e){
        System.out.println("Erro " + e);
    }
}

private void ler(){
    try{

        SComm serial = new SComm(cboPortas.getSelectedItem().toString().trim());
        serial.abrirPorta();
        serial.habilitarEscrita();
        serial.lerDados();
    }
    catch(Exception e){
        System.out.println("Erro " + e);
    }
}

}

D

Cara, tenta criar uma nova pasta e colocar os seus arquivos lá dentro. Substitua o seu arquivo Serial.java pelo que estou te enviando em anexo e execute o mesmo para ver se funciona. Não cheguei a olhar muito bem o seu arquivo Serial.java, mas verifiquei que os outros dois estão corretos e ao testá-los juntamente com o arquivo que estou te mandando funcionou sem problemas. Não esquece de adicionar o nome do seu package. No arquivo que estou te mandando vai ter o package Testando que foi o que criei de exemplo. Qualquer coisa prende um grito, falow.

package Testando;

import SrCom3.*;

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

         //preparação do frame de comunicação
         StringBuffer aux3 =
         new StringBuffer("0102018210466F676F206E6F207365746F7220342003A6");

         String aux3HexToString = new String("");

         //Transforma os valores da String contida na variável
         //aux3 de hexadecimal para Caracter
         for(int i = 0; i < aux3.length(); i += 2){
            String aux3Temp = aux3.substring(i, i + 2);
            aux3HexToString +=
             new Character((char)
             (Integer.valueOf(aux3Temp,16).intValue())).toString();
         }

         Stest st = new Stest();

         if ( st.PortaExiste("COM1") == true) {
                 System.out.println("Iniciando comunicação!");
                 SComm1 sc = new SComm1("COM1",19200,1000);
                 sc.HabilitarEscrita();
                 sc.ObterIdDaPorta();
                 sc.AbrirPorta();
                 sc.EnviarUmaString(aux3HexToString);
                 System.out.println(aux3HexToString);
                 sc.FecharCom();

          }  else {
                 System.out.println("Nenhuma porta");
          }
     }

}
Criado 14 de dezembro de 2004
Ultima resposta 15 de dez. de 2004
Respostas 8
Participantes 2