Amigos
Estou usando RXTX na leitura da porta serial (balança eletronica) e os dados lidos vem com muito “lixo”, não sei se é assim mesmo que tem que vir para depois eu ter que tratar estes dados, mas o fato é que pelo HyperTerminal, os dados vem bem legiveis, “limpos”, se os parametros estiverem corretos, se mudar os parametros só vem “lixo”. A partir disto fiz o teste de mudar os parametros no meu programa e para qualquer coisa que eu definir nestes parametros, os dados são lidos, mas vem com “lixo” do mesmo jeito, me levando a crer que estes parametros estao sendo ignorados.
Por isso eu acho que tem algo errado no programa e gostaria da ajuda do pessoal do forum para confirmar isto, antes de ter todo trabalho para “limpar” na mão os dados lidos da serial.
Segue o codigo abaixo.
public class SCom implements Runnable, SerialPortEventListener {
//propriedades
private String Porta;
public String dadosLidos;
public String dadosLidosSel;
public int nodeBytes;
private int baudrate;
private int timeout;
private CommPortIdentifier cp;
private SerialPort porta;
private OutputStream saida;
private InputStream entrada;
private Thread threadLeitura;
public String displayStatus;
public String monitorStatus;
public void setTextStatus(String monitorStatus){
this.monitorStatus = monitorStatus;
}
//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 SCom() {
Porta = "COM1";
baudrate = 9600;
timeout = 20000;
};
//um Objeto ComObj � passado ao construtor
//com detalhes de qual porta abrir
//e informa��es sobre configura��es
public SCom( 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;
displayStatus = "Habilitando Escrita";
setTextStatus(displayStatus);
}
//habilita leitura de dados
public void HabilitarLeitura(){
Escrita = false;
Leitura = true;
displayStatus = "Habilitando Leitura";
setTextStatus(displayStatus);
}
//Obt�m o ID da PORTA
public void ObterIdDaPorta(){
try {
cp = CommPortIdentifier.getPortIdentifier(Porta);
displayStatus = "Porta selecionada: " + Porta + " - " + cp;
setTextStatus(displayStatus);
if ( cp == null ) {
JOptionPane.showMessageDialog(null,
"A " + Porta + " n�o existe. Abortando !",
"Erro!",
JOptionPane.ERROR_MESSAGE);
System.out.println("A " + Porta + " nao existe!" );
System.out.println("ERRO!Abortando..." );
displayStatus = displayStatus + " " + "A " + Porta + " n�o existe. Abortando !";
setTextStatus(displayStatus);
IDPortaOK = false;
System.exit(1);
}
IDPortaOK = true;
displayStatus = displayStatus + " - Id Porta OK !";
setTextStatus(displayStatus);
} catch (Exception e) {
JOptionPane.showMessageDialog(null,
"Erro durante o procedimento. STATUS" + e,
"Erro!",
JOptionPane.ERROR_MESSAGE);
System.out.println("Erro durante o procedimento. STATUS" + e );
displayStatus = "Erro durante o procedimento. STATUS" + e ;
setTextStatus(displayStatus);
IDPortaOK = false;
System.exit(1);
}
}
//Abre a comunica��o da porta
public void AbrirPorta(){
try {
porta = (SerialPort)cp.open("SComm", timeout);
//configurar par�metros
porta.setSerialPortParams(baudrate,
SerialPort.DATABITS_8,
SerialPort.STOPBITS_2,
SerialPort.PARITY_EVEN);
porta.setFlowControlMode(SerialPort.FLOWCONTROL_NONE);
PortaOK = true;
System.out.println("Porta aberta com sucesso!");
displayStatus = "Porta aberta com sucesso!" + "\n Porta: " + porta;
setTextStatus(displayStatus);
} catch (Exception e) {
PortaOK = false;
JOptionPane.showMessageDialog(null,
"Erro ao abrir a porta! STATUS: " + e,
"Erro!",
JOptionPane.ERROR_MESSAGE);
System.out.println("Erro ao abrir a porta! STATUS: " + e );
displayStatus = "Erro ao abrir a porta! STATUS: " + e;
setTextStatus(displayStatus);
System.exit(1);
}
}
//fun��o que envie um bit para a porta serial
public void EnviarUmaString(String msg){
if (Escrita == true) {
try {
System.out.println("Teste envio, FLUXO OK!");
displayStatus = "Teste envio, FLUXO OK!";
setTextStatus(displayStatus);
} catch (Exception e) {
JOptionPane.showMessageDialog(null,
"Erro. STATUS: " + e,
"Erro!",
JOptionPane.ERROR_MESSAGE);
System.out.println("Erro.STATUS: " + e );
displayStatus = "Erro.STATUS: " + e ;
setTextStatus(displayStatus);
}
try {
System.out.println("Enviando um byte para " + Porta );
System.out.println("Enviando : " + msg );
displayStatus = "Enviando um byte para " + Porta + "Enviando : " + msg ;
setTextStatus(displayStatus);
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 );
displayStatus = "Houve um erro durante o envio. " + "STATUS: " + e ;
setTextStatus(displayStatus);
System.exit(1);
}
} else {
System.exit(1);
}
}
//leitura de dados na serial
public void LerDados(){
displayStatus = "";
if (Escrita == false){
try {
entrada = porta.getInputStream();
System.out.println("Leitura FLUXO OK!");
displayStatus = displayStatus + "Leitura FLUXO OK!" ;
setTextStatus(displayStatus);
} catch (Exception e) {
JOptionPane.showMessageDialog(null,
"Erro de fluxo! STATUS: " + e,
"Erro!",
JOptionPane.ERROR_MESSAGE);
System.out.println("Erro.STATUS: " + e );
displayStatus = displayStatus + "Erro.STATUS: " + e ;
setTextStatus(displayStatus);
System.exit(1);
}
try {
porta.addEventListener(this);
System.out.println("SUCESSO. Porta aguardando...");
displayStatus = displayStatus + " SUCESSO. Porta aguardando...";
setTextStatus(displayStatus);
} catch (Exception e) {
JOptionPane.showMessageDialog(null,
"Erro ao criar listener! STATUS: " + e,
"Erro!",
JOptionPane.ERROR_MESSAGE);
System.out.println("Erro ao criar listener: ");
System.out.println("STATUS: " + e);
displayStatus = "Erro ao criar listener: " + "STATUS: " + e;
setTextStatus(displayStatus);
System.exit(1);
}
porta.notifyOnDataAvailable(true);
try {
threadLeitura = new Thread(this);
displayStatus = displayStatus + " Iniciando Leitura ..." ;
setTextStatus(displayStatus + "\n");
threadLeitura.start();
} catch (Exception e) {
JOptionPane.showMessageDialog(null,
"Erro ao iniciar leitura! STATUS: " + e,
"Erro!",
JOptionPane.ERROR_MESSAGE);
System.out.println("Erro ao iniciar leitura: " + e );
displayStatus = "Erro ao iniciar leitura: " + e ;
setTextStatus(displayStatus);
}
}
}
//m�todo RUN da thread de leitura
public void run(){
try {
Thread.sleep(5000);
} catch (Exception e) {
JOptionPane.showMessageDialog(null,
"Erro! STATUS: " + e,
"Erro!",
JOptionPane.ERROR_MESSAGE);
System.out.println("Erro. Status = " + e );
setTextStatus("Erro. Status = " + e );
}
}
//gerenciador de eventos de leitura na serial
public void serialEvent(SerialPortEvent ev){
displayStatus = displayStatus + "\n Inicio SerialEvent" + "\n";
try {
File file = new File("etiqueta.txt");
FileWriter writer = new FileWriter(new File("etiqueta.txt"));
PrintWriter saidatxt = new PrintWriter(writer, true);
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:
String dadosLidosSel = new String();
byte[] bufferLeitura = new byte[16];
try {
while ( entrada.available() > 0 ) {
nodeBytes = entrada.read(bufferLeitura);
}
String dadosLidos = new String(bufferLeitura);
if (bufferLeitura.length == 0) {
System.out.println("Nada lido. Verifique a balança!");
} else if (bufferLeitura.length == 1 ){
System.out.println("Apenas um byte foi lido. Verifique a balança!");
} else {
//Imprime todos os dados lidos.
if (bufferLeitura == null) {
System.out.println("(null)");
} else {
displayStatus = displayStatus + " bufferLeitura: " + Integer.toString(bufferLeitura.length) + "\n";
for (int i = 0; i < bufferLeitura.length; ++i) {
if (i % 16 == 0){
//System.out.print (Integer.toHexString ((i & 0xFFFF) | 0x10000).substring(1,5) + " - ");
}
System.out.print(Integer.toHexString((bufferLeitura[i]&0xFF) | 0x100).substring(1,3) + " ");
if (i % 16 == 15 || i == bufferLeitura.length - 1){
int j;
for (j = 16 - i % 16; j > 1; --j)
System.out.print(" ");
System.out.print(" - ");
int start = (i / 16) * 16;
int end = (bufferLeitura.length < i + 1) ? bufferLeitura.length : (i + 1);
for (j = start; j < end; ++j)
//if (bufferLeitura[j] >= 32 && bufferLeitura[j] <= 126){
if (bufferLeitura[j] >= 47 && bufferLeitura[j] <= 58){
System.out.print((char)bufferLeitura[j]);
} else{
System.out.print(".");
}
System.out.println();
}
}
System.out.println();
}
saidatxt.println(dadosLidos);
}
} catch (Exception e) {
JOptionPane.showMessageDialog(null,
"Erro durante leitura! STATUS: " + e,
"Erro!",
JOptionPane.ERROR_MESSAGE);
System.out.println("Erro durante a leitura: " + e );
}
System.out.println(" n.o de bytes lidos : " + nodeBytes );
break;
}
saidatxt.close();
writer.close();
} catch (IOException ex) {
ex.printStackTrace();
}
}
//fun��o que fecha a conex�o
public void FecharCom(){
try {
porta.close();
System.out.println("CONEXAO FECHADA>>FIM..");
displayStatus = "CONEXAO FECHADA>>FIM.." ;
setTextStatus(displayStatus);
} catch (Exception e) {
JOptionPane.showMessageDialog(null,
"Erro ao fehcar comunica��o! STATUS: " + e,
"Erro!",
JOptionPane.ERROR_MESSAGE);
System.out.println("ERRO AO FECHAR. STATUS: " + e );
displayStatus = "ERRO AO FECHAR. STATUS: " + e ;
setTextStatus(displayStatus);
System.exit(0);
}
}
}
No entando o comando abaixo me mostra que os valores foram setados… aumentando mais ainda minhas duvidas.
setTextStatus(displayStatus + "\n BaudRate: " + porta.getBaudRate() + "\n DataBits: " + porta.getDataBits() + "\n StopBits: " + porta.getStopBits() + "\n Parity: " + porta.getParity() + "\n FlowControlMode: " + porta.getFlowControlMode() + "\n ");
Obrigado a todos