Comunicação serial, erro ao imprimir variável

Pessoal, estou tentando imprimir uma variável que monto a partir de dados recebidos pela serial, porém já tentei de varias maneiras ( ao meu nível de conhecimento) e não estou conseguindo fazer a impressão. Vou compartilhar código que montei baseado em exemplos.

/*

  • To change this license header, choose License Headers in Project Properties.
  • To change this template file, choose Tools | Templates
  • and open the template in the editor.
    */
    package serial;

import gnu.io.CommPortIdentifier;
import gnu.io.SerialPort;
import gnu.io.SerialPortEvent;
import gnu.io.SerialPortEventListener;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.util.Enumeration;
import javax.swing.JOptionPane;
import telas.Mapa;

/**
*

  • @author johnn
    */
    public class SerialRxTx implements SerialPortEventListener {

    SerialPort serialPort = null;

    private String appName; // Nome da aplicação
    Mapa mapa = new Mapa();

    private BufferedReader input; //Leitura da serial
    private OutputStream output; //Escrita na serial

    private static final int TIME_OUT = 1000; // Tempo de espera fixo
    private static int DATA_RATE = 9600; // Velocidade porta
    private String serialPortName = “COM5”;

    String aux[];
    public String tipoDado;
    public String temperatura;
    public String bufferEntrada;

    public boolean iniciaSerial() {
    boolean status = false;
    try {
    // Obtem portas seriais do sistema
    CommPortIdentifier portId = null;
    Enumeration portEnum = CommPortIdentifier.getPortIdentifiers();

         while (portId == null && portEnum.hasMoreElements()) {
             CommPortIdentifier currPortId = (CommPortIdentifier) portEnum.nextElement();
    
             if (currPortId.getName().equals(serialPortName) || currPortId.getName().startsWith(serialPortName)) { //Se for porta esperada entra no if
                 serialPort = (SerialPort) currPortId.open(appName, TIME_OUT);
                 portId = currPortId;
                 System.out.println("Conectado em: " + currPortId.getName());
                 JOptionPane.showMessageDialog(null, "Conectado na porta " + currPortId.getName());
                 break;
             }
         }
    
         if (portId == null || serialPort == null) {
             System.out.println("Erro grave - VERIFIQUE");
             JOptionPane.showMessageDialog(null, "Erro, verifique");
             return false;
         }
         serialPort.setSerialPortParams(DATA_RATE,
                 SerialPort.DATABITS_8,
                 SerialPort.STOPBITS_1,
                 SerialPort.PARITY_NONE);
    
         serialPort.addEventListener(this);
         serialPort.notifyOnDataAvailable(true);
         status = true;
    
         try {
             Thread.sleep(1000);
         } catch (InterruptedException e) {
             e.printStackTrace(); //imprime a pilha de exeção casso erro.
         }
    
     } catch (Exception e) {
         e.printStackTrace(); //imprime a pilha de exeção casso erro.
         status = false;
     }
     return status;
    

    }

    public void sendData(String data) { // enviar dado pela serial
    try {
    output = serialPort.getOutputStream();
    output.write(data.getBytes());

     } catch (Exception e) {
         System.err.println(e.toString()); //mensagem de erro 
    
     }
    

    }

    public synchronized void close() { // metodo fechar porta serial
    if (serialPort != null) {
    serialPort.removeEventListener();
    serialPort.close();
    System.out.println(“Porta Serial Encerrada”);
    }
    }

    @Override
    public void serialEvent(SerialPortEvent spe) {
    //metodo chegada de dados
    try {
    switch (spe.getEventType()) {
    case SerialPortEvent.DATA_AVAILABLE:
    if (input == null) {
    input = new BufferedReader( //cria o buffer
    new InputStreamReader( // constroi
    serialPort.getInputStream())); //entrada porta serial
    }
    System.out.println("chegou: " + getBufferEntrada());
    setBufferEntrada(input.readLine());

                 aux = bufferEntrada.split(":");
                 if (aux.length == 2) {
                     tipoDado = aux[0];
                     temperatura = aux[1];
                 }
    
                 System.out.println("AUX 0 = " + getTipoDado());
                 System.out.println("AUX 1 = " + getTemperatura());
                 break;
             default:
                 break;
         }
     } catch (Exception e) {
         e.printStackTrace();
     }
    

    }

    public static int getDATA_RATE() {
    return DATA_RATE;
    }

    public static void setDATA_RATE(int DATA_RATE) {
    SerialRxTx.DATA_RATE = DATA_RATE;
    }

    public String getSerialPortName() {
    return serialPortName;
    }

    public void setSerialPortName(String serialPortName) {
    this.serialPortName = serialPortName;
    }

    public SerialPort getSerialPort() {
    return serialPort;
    }

    public void setSerialPort(SerialPort serialPort) {
    this.serialPort = serialPort;
    }

    public String getBufferEntrada() {
    return bufferEntrada;
    }

    public void setBufferEntrada(String bufferEntrada) {
    this.bufferEntrada = bufferEntrada;
    }

    public String getTipoDado() {
    return tipoDado;
    }

    public void setTipoDado(String tipoDado) {
    this.tipoDado = tipoDado;
    }

    public String getTemperatura() {
    return temperatura;
    }

    public void setTemperatura(String temperatura) {
    this.temperatura = temperatura;
    }

    public String exibeTemperatura() {
    return aux[1];
    }

}

preciso imprimir esse dado pela tela Mapa. Pode ser diretamente no console, para eu poder posteriormente adiciona-la a tela. Código abaixo

/*

  • To change this license header, choose License Headers in Project Properties.
  • To change this template file, choose Tools | Templates
  • and open the template in the editor.
    */
    package telas;

import serial.SerialRxTx;
import javax.swing.Timer;

/**
*

  • @author johnn
    */
    public class Mapa extends javax.swing.JFrame {

    SerialRxTx serial = new SerialRxTx();

    public Mapa() {
    initComponents();
    }

    /**

    • This method is called from within the constructor to initialize the form.

    • WARNING: Do NOT modify this code. The content of this method is always

    • regenerated by the Form Editor.
      */
      @SuppressWarnings(“unchecked”)
      //
      private void initComponents() {

      jPanel2 = new javax.swing.JPanel();
      JB_voltar = new javax.swing.JButton();
      JL_temperatura = new javax.swing.JLabel();
      JL_valorTemperatura = new javax.swing.JLabel();

      setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
      setTitle(“Supervisorio”);
      setResizable(false);

      JB_voltar.setText(“VOLTAR”);
      JB_voltar.addMouseListener(new java.awt.event.MouseAdapter() {
      public void mouseClicked(java.awt.event.MouseEvent evt) {
      JB_voltarMouseClicked(evt);
      }
      });

      JL_temperatura.setFont(new java.awt.Font(“Tahoma”, 0, 24)); // NOI18N
      JL_temperatura.setText(“Temperatura”);

      JL_valorTemperatura.setFont(new java.awt.Font(“Tahoma”, 0, 24)); // NOI18N
      JL_valorTemperatura.setText(“0”);

      javax.swing.GroupLayout jPanel2Layout = new javax.swing.GroupLayout(jPanel2);
      jPanel2.setLayout(jPanel2Layout);
      jPanel2Layout.setHorizontalGroup(
      jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
      .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, jPanel2Layout.createSequentialGroup()
      .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
      .addComponent(JB_voltar)
      .addContainerGap())
      .addGroup(jPanel2Layout.createSequentialGroup()
      .addContainerGap()
      .addComponent(JL_temperatura)
      .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
      .addComponent(JL_valorTemperatura, javax.swing.GroupLayout.PREFERRED_SIZE, 130, javax.swing.GroupLayout.PREFERRED_SIZE)
      .addContainerGap(312, Short.MAX_VALUE))
      );
      jPanel2Layout.setVerticalGroup(
      jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
      .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, jPanel2Layout.createSequentialGroup()
      .addGap(30, 30, 30)
      .addGroup(jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
      .addComponent(JL_valorTemperatura, javax.swing.GroupLayout.PREFERRED_SIZE, 29, javax.swing.GroupLayout.PREFERRED_SIZE)
      .addComponent(JL_temperatura))
      .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 307, Short.MAX_VALUE)
      .addComponent(JB_voltar)
      .addContainerGap())
      );

      javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
      getContentPane().setLayout(layout);
      layout.setHorizontalGroup(
      layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
      .addComponent(jPanel2, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
      );
      layout.setVerticalGroup(
      layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
      .addComponent(jPanel2, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
      );

      pack();
      setLocationRelativeTo(null);
      }//

    private void JB_voltarMouseClicked(java.awt.event.MouseEvent evt) {
    // TODO add your handling code here:
    dispose();
    new Inicial().setVisible(true);
    }

    /**

    • @param args the command line arguments
      /
      public static void main(String args[]) {
      /
      Set the Nimbus look and feel /
      //
      /
      If Nimbus (introduced in Java SE 6) is not available, stay with the default look and feel.

      • For details see http://download.oracle.com/javase/tutorial/uiswing/lookandfeel/plaf.html
        /
        try {
        for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) {
        if (“Nimbus”.equals(info.getName())) {
        javax.swing.UIManager.setLookAndFeel(info.getClassName());
        break;
        }
        }
        } catch (ClassNotFoundException ex) {
        java.util.logging.Logger.getLogger(Mapa.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (InstantiationException ex) {
        java.util.logging.Logger.getLogger(Mapa.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (IllegalAccessException ex) {
        java.util.logging.Logger.getLogger(Mapa.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (javax.swing.UnsupportedLookAndFeelException ex) {
        java.util.logging.Logger.getLogger(Mapa.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        }
        //
        /
        Create and display the form */

      java.awt.EventQueue.invokeLater(new Runnable() {
      public void run() {
      try {
      System.out.println("" +serial.getTemperatura());
      new Mapa().setVisible(true);
      } catch (Exception e) {

           }
      
       }
      

      });
      }

    // Variables declaration - do not modify
    private javax.swing.JButton JB_voltar;
    private javax.swing.JLabel JL_temperatura;
    public javax.swing.JLabel JL_valorTemperatura;
    private javax.swing.JPanel jPanel2;
    // End of variables declaration
    }

ele não me deixa imprimir desta maneira:
System.out.println("" +serial.getTemperatura())

Erro? Exception? Comportamento? Explosão?

Opa amigo, Apos passar todas as variaveis para static, e gerar os getter e setter novamente, funcionou. Agradeço a ajuda!

Essa solução parece muito pior que o problema. No longo prazo, isso vai dar muito ruim.

Me parece que seu erro é criar um novo BufferedInputStream a cada novo evento da serial. O ideal seria criar esse stream antes, e só fazer a leitura dele durante o evento.

Ou então, deixar uma thread monitorando a serial. Talvez dar uma olhada em como esse usuário organizou a classe dele te ajude: Dúvida com Threads