Problema com formatação de byte para String

6 respostas
Tomassoni

Galera alguem por favor poderia me dizer como faço pra formatar um byte em string.

Estou lendo dados de uma balaça, e os dados via Hyper Terminal vem assim:

  • 112 g ...
    

Na minha aplicação leio os dados e ele vem assim:

  • 1
    

12 g

Ou seja fiz um display para interfacear com o usuário do que so aparece o 12g sendo que são 112g.

Ja fiz de tudo que imaginei e pensei …

segue o codigo:

/*

  • HoraData.java
  • Created on 6 de Maio de 2006, 00:03
  • To change this template, choose Tools | Template Manager
  • and open the template in the editor.
    */

package Control;

import java.awt.event.ActionEvent;

import java.awt.event.ActionListener;

import java.io.IOException;

import java.io.InputStream;

import java.util.Enumeration;

import java.util.TooManyListenersException;

import javax.comm.CommPortIdentifier;

import javax.comm.PortInUseException;

import javax.comm.SerialPort;

import javax.comm.SerialPortEvent;

import javax.comm.SerialPortEventListener;

import javax.comm.UnsupportedCommOperationException;

import javax.sql.rowset.serial.SerialArray;

/**
*

  • @author Rogerio
    */
    public class CommBalanca implements Runnable, SerialPortEventListener{

    static CommPortIdentifier portId;
    
    static Enumeration portList;
    
    private InputStream inputStream;
    
    private SerialPort serialPort;
    
    private Thread readThread;
    
    private byte[] readBuffer;
    
    /** Creates a new instance of HoraData */
    
    public CommBalanca() {
    
    detectaRS232();
    

    }

    private void detectaRS232(){
    
    portList = CommPortIdentifier.getPortIdentifiers();
    
    while (portList.hasMoreElements()) {
    
    portId = (CommPortIdentifier) portList.nextElement();
    
    if (portId.getPortType() == CommPortIdentifier.PORT_SERIAL) {
    
    if (portId.getName().equals(COM1)) {
    
    setConfPorta();
    
    }
    
    }
    
    }
    
    }
    
    private void setConfPorta(){
    
    try {
    
    serialPort = (SerialPort) portId.open(Lendo, 2000);
    
    } catch (PortInUseException e) {}
    
    try {
    
    inputStream = serialPort.getInputStream();
    
    } catch (IOException e) {}
    
    try {
    
    serialPort.addEventListener(this);
    
    } catch (TooManyListenersException e) {}
    
    serialPort.notifyOnDataAvailable(true);
    
    try {
    
    serialPort.setSerialPortParams(9600,
    
    SerialPort.DATABITS_7,
    
    SerialPort.STOPBITS_1,
    
    SerialPort.PARITY_ODD);
    

    } catch (UnsupportedCommOperationException e) {}

    }

    public void serialEvent(SerialPortEvent serialPortEvent){
    
    switch(serialPortEvent.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:
    
    readBuffer = new byte[12];
    
    try {
            while (inputStream.available() > 0) {
               int numBytes = inputStream.read(getReadBuffer());
             //  System.out.println("numBytes: " + numBytes);
            }
            System.out.println(new String(readBuffer).trim());
            
         } catch (IOException e) {}
         break;
    

    }
    }

    public byte[] getReadBuffer() {
    
    return readBuffer;
    
    }
    
    public void run() {
    
    try {
    
    Thread.sleep(10000);
    
    } catch (InterruptedException e) {}
    
    }
    

}
Nada mais eh que o SimpleRead da Sun.

6 Respostas

peron

Olá,

Utilize sempre as tags “code” que fica mais facil visualizar seu código…

Sobre sua dúvida, vc queria criar uma string a partir de um array de bytes?

se for, a própria classe String tem um construtor que a inicializa assim:

'http://java.sun.com/j2se/1.4.2/docs/api/java/lang/String.html#String(byte[])

ou seja:

String suastring = new String(arrBytes);

Espero ter ajudado…

att.

KWill

Eu mesmo nao entendo muito de comunicacao via porta serial, mas acho que posso ajudar indicando o uso da classe InputStreamReader ou da classe BufferedReader, caso se queira ler caracteres a partir de um inputStream. Ficaria assim mais ou menos:

InputStreamReader leitor = new InputStreamReader(seu_InputStream);

ou:

BufferedReader leitor = new BufferedReader(new InputStreamReader(seu_InputStream));

Quanto ao problema da mensagem no terminal vir em 2 pedaços, acho que vc pode usar o System.out.print() no lugar do System.out.println() ou tentar usar um BufferedReader, usando o metodo ReadLine() para tentar ler uma linha inteira. Não vejo muito sentido no trim() que você dá na mensagem:

System.out.println(new String(readBuffer).trim());

Outra coisa que me intriga é o trecho:

case SerialPortEvent.DATA_AVAILABLE:
readBuffer = new byte[12];

Esse trecho nao estaria fazendo alguma besteira? posso estar enganado…

Tomassoni

Galera valeu pela atenção !!! :slight_smile:
Bem resolvi o problema, e ele estava no trecho

try {

while (inputStream.available() > 10) {  <----- Aqui *

int numBytes = inputStream.read(readBuffer);

}

String pdados = new String(new String(readBuffer).trim().intern());

//  System.out.println(new String(readBuffer).trim().toString());

setDados(pdados);
} catch (IOException e) {}
        break;
  }

antes eu estava pegando se > 0 ai ele contava os bytes e pulava a linha pro proximo byte, ai passei a pegar do 10 e funcionou…!!! :slight_smile:

Enquanto a usar a TAG “code” não sei como fazer pode me ajudar, assim torno isso mais legivel para coloborar com todos, inclusive eu!

Valeu mais uma vez :slight_smile:

peron
Use [/code] e
sendo que use primeiro o [code] ai coloque tudo q vc tem de codigo e depois use o
para fechar.

att.

KWill

Tem o botao “Code” na página onde você monta as suas respostas, é só cliquar nele para que a Tag seja inserida. Quanto a solução que você encontrou, é bom que você saiba que ele só vai entrar dentro do laço while caso haja pelo menos 11 bytes disponíveis para você ler no InputStream.

Tomassoni

Ok, Valeu pela ajuda!

Criado 20 de setembro de 2006
Ultima resposta 20 de set. de 2006
Respostas 6
Participantes 3