Problema com formatação de byte para String

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.

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.

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…

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:

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

att.

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.

Ok, Valeu pela ajuda!