Boa tarde a todos!
Faz um tempo que eu não utilizo a linguagem JAVA para criar aplicativos, mas me deparei com um projeto em que meus superiores exigiram a utilização da mesma.
Busquei aqui no forum e encontrei um tutorial muito didático e de fácil compreensão, realizei algumas alterações e estou utilizando ele por enquanto até entender o funcionamento da API. Estou comunicando com a porta serial COM1 utilizando a API JAVACOMM, o processo de comunicação está correto, minha dificuldade é entender os caracteres vindos do equipamento ligado na porta serial. Segue abaixo o formato que está sendo retornado junto os formatos correspondentes:
.:: Iniciando leitura ::.
O QUE FOI REALMENTE LIDO UTF8: ???x?xfxfx ???
O QUE FOI REALMENTE LIDO ISO-8859-1: ???x?xfxfx þ???
O QUE FOI REALMENTE LIDO ascii: ???x?xfxfx ???
O QUE FOI REALMENTE LIDO ASCII: ???x?xfxfx ???
Segue código:
/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
/**
*
* @author Graziani Garcia
*/
import com.sun.org.apache.xerces.internal.impl.dv.util.Base64;
import java.awt.Font;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.comm.*;
import java.io.*;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
public class SrCom 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 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
private String linArq;
private String linArq2;
private String linArq3;
private String linArq4;
private String fechaArq;
TelaPrincipal telaPrincipal = new TelaPrincipal();
private JLabel jLabel1 = new JLabel();
public SrCom() {
Porta = "COM1";
baudrate = 9600;
timeout = 1000;
};
//um Objeto ComObj é passado ao construtor
//com detalhes de qual porta abrir
//e informações sobre configurações
public SrCom( 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 ) {
JOptionPane.showMessageDialog(null, "A " + Porta + " nâo existe! ERRO! Abortando...");
IDPortaOK = false;
System.exit(1);
}
IDPortaOK = true;
} catch (Exception e) {
JOptionPane.showMessageDialog(null,"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("SCom",timeout);
PortaOK = true;
// System.out.println("Porta aberta com sucesso!");
// telaPrincipal.jLabel1.setText("Porta aberta com sucesso!");
//configurar parâmetros
porta.setSerialPortParams(baudrate,
porta.DATABITS_8,
porta.STOPBITS_2,
porta.PARITY_NONE);
} catch (Exception e) {
PortaOK = false;
JOptionPane.showMessageDialog(null,"Erro ao abrir a porta! STATUS: " + e );
System.exit(1);
}
}
//leitura de dados na serial
public void LerDados(){
if (Leitura == true){
try {
entrada = porta.getInputStream();
JOptionPane.showMessageDialog(null,"FLUXO OK!");
} catch (Exception e) {
JOptionPane.showMessageDialog(null,"Erro.STATUS: " + e);
System.exit(1);
}
try {
porta.addEventListener(this);
JOptionPane.showMessageDialog(null,"SUCESSO. Porta aguardando...");
} catch (Exception e) {
JOptionPane.showMessageDialog(null,"Erro ao criar listener. STATUS: " + e);
System.exit(1);
}
porta.notifyOnDataAvailable(true);
try {
threadLeitura = new Thread(this);
threadLeitura.start();
run();
} catch (Exception e) {
JOptionPane.showMessageDialog(null,"Erro ao iniciar leitura: " + e);
}
}
}
//método RUN da thread de leitura
public void run(){
try {
Thread.sleep(5000);
} catch (Exception e) {
JOptionPane.showMessageDialog(null,"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, "UTF8");
String Dadoslidos2 = new String(bufferLeitura, "ISO-8859-1");
String Dadoslidos3 = new String(bufferLeitura, "ascii");
String Dadoslidos4 = new String(bufferLeitura, "ASCII");
linArq = ".:: Iniciando leitura ::.";
GerarArquivo(linArq);
if (bufferLeitura.length == 0) {
linArq = "Nada foi lido!";
GerarArquivo(linArq);
} else if (bufferLeitura.length == 1 ){
linArq = "Apenas um byte foi lido!";
GerarArquivo(linArq);
} else {
linArq = " O QUE FOI REALMENTE LIDO UTF8: " + Dadoslidos;
linArq2 = " O QUE FOI REALMENTE LIDO ISO-8859-1: " + Dadoslidos2;
linArq3 = " O QUE FOI REALMENTE LIDO ascii: " + Dadoslidos3;
linArq4 = " O QUE FOI REALMENTE LIDO ASCII: " + Dadoslidos4;
GerarArquivo(linArq);
GerarArquivo(linArq2);
GerarArquivo(linArq3);
GerarArquivo(linArq4);
}
} catch (Exception e) {
JOptionPane.showMessageDialog(null,"Erro durante a leitura: " + e);
}
linArq = "n.o de bytes lidos : " + nodeBytes;
GerarArquivo(linArq);
break;
}
}
public void GerarArquivo(String linha){
File file = new File("C:\\");
if(file.exists() == false){
JOptionPane.showMessageDialog(null,"Diretório " + file + " não existe!!");
}
try {
FileWriter writer = new FileWriter(new File("C:\\LogMedidor.txt"),true);
PrintWriter saida = new PrintWriter(writer);
saida.println(linha);
saida.close();
writer.close();
} catch (IOException ex) {
Logger.getLogger(SrCom.class.getName()).log(Level.SEVERE, null, ex);
}
}
//função que fecha a conexão
public void FecharCom(){
try {
porta.close();
JOptionPane.showMessageDialog(null,"CONEXAO FECHADA>>FIM..");
} catch (Exception e) {
JOptionPane.showMessageDialog(null,"ERRO AO FECHAR. STATUS: " + e);
System.exit(0);
}
}
//Acessores
public String obterPorta(){
return Porta;
}
public int obterBaudrate(){
return baudrate;
}
}
Desculpe caso não esteja respeitando muito os padrões de projeto, está é apenas um protótipo para testar a comunicação.
Aguardo retorno ciente de que serei muito bem instruído.
Att,
Graziani Garcia