Ler dados da porta COMM (SerialEventListener) - Java

Fala pessoal, tudo bem? Tô tentando converter um código C# pra Java e to com alguns problemas…

Eu tô tentando ler uma porta serial,

private InputStream inputStream;
private OutputStream outputStream;

 outputStream = serialPort.getOutputStream();
 inputStream = serialPort.getInputStream();

Pra enviar os dados, está indo certinho, o problema está na hora de ler mesmo.

No C#, eu tenho um método de recepção:

public void recepcaoResposta(int tam, byte[] frameHex)
{
    byte[] l_frameHex = new byte[2000];
    byte[] frameEvt = new byte[16];
    string linha, linhaTipo;

    // !! Copia vetor-parâmetro para vetor-local (evita exception nos "if's"
    //caso apenas 1 byte recebido) !!
    Buffer.BlockCopy(frameHex, 0, l_frameHex, 0, tam);
    .....
}

Convertendo pro Java fica:

public void recepcaoResposta(int tam, byte[] frameHex) {
    byte[] l_frameHex = new byte[2000];
    byte[] frameEvt = new byte[16];
    String linha, linhaTipo;

    // !! Copia vetor-parâmetro para vetor-local (evita exception nos "if's"
    //caso apenas 1 byte recebido) !!
    System.arraycopy(frameHex, 0, l_frameHex, 0, tam);
    ...
}

Até aí ok, o problema está na hora de receber o tam, que é o tamanho do array. No java eu tenho o retorno de tamanho 8, independente do que eu faça, vem o 8.

Até tentei mudar os ifs que tem um número “aleátório” de tamanho pra 8. MAS obviamente eu obtive erros:

Código original:

        //**********************************************************
        //4 - Envio automático de evento
        //**********************************************************
        if ( (l_frameHex[1] == 0x04) && (tam == 20) )
        { 
        ....            
        }

Enfim, estou recebendo os dados do serial assim:

@Override
public void serialEvent(SerialPortEvent event) {
    switch (event.getEventType()) {
        case SerialPortEvent.DATA_AVAILABLE:
            try {
            while (inputStream.available() > 0) {
//                    int t = inputStream.read();
                int t = serialPort.getDataBits();
                byte[] f = new byte[t];
                inputStream.read(f, 0, t);  // Frame de bytes
                recepcaoResposta(t, f);
            }

        } catch (IOException e) {
            System.out.println("IO Exception in SerialEvent()" + e);
        }
        break;
    }
}

Mas como foi dito, só tenho o retorno de tamanho 8, que nesse código acima é o

int t = serialPort.getDataBits();
1 curtida

Onde está definido essa variável? Ela é de qual tipo?

Opa @Lucas_Camara, é SerialPort;

String portName = COM13
SerialPort serialPort= (SerialPort) cpi.open(portName, 1000);

Descobri porquê só vinha 8. Eu estava pegando o dataBit. Por isso um valor fixo.

Mas ainda não consegui receber os dados corretamente usando o InputStream

Que seria esse de cima…

Sempre retorna um valor aleatório

Bom, depois de muita tentativa consegui chegar nisso, está funcionando perfeitamente:

public static InputStream inputStream;
public static OutputStream outputStream;

@Override
public void serialEvent(SerialPortEvent evt) {
    switch (evt.getEventType()) {
        case SerialPortEvent.BI:
        //Quebra interupção.
        case SerialPortEvent.OE:
        //Erro de saturação.
        case SerialPortEvent.FE:
        //Erro de enquadramento.
        case SerialPortEvent.PE:
        //Erro de pariedade.
        case SerialPortEvent.CD:
        //Detecção de portadora.
        case SerialPortEvent.CTS:
        //Limpa para enviar.
        case SerialPortEvent.DSR:
        //Conjunto de dados prontos.
        case SerialPortEvent.RI:
        //Caminho indicado.
        case SerialPortEvent.OUTPUT_BUFFER_EMPTY:
            /*Buffer de saída está vazio. O evento será gerado depois de uma gravação for concluída,
             quando o buffer do sistema torna-se vazia novamente..."
             */
            break;
        case SerialPortEvent.DATA_AVAILABLE:
            /*Dados disponíveis na porta serial. "
             + "Este evento será gerada uma vez quando dados novos chegam na porta de série. "
             + "Mesmo se o usuário não ler os dados, "
             + "não será gerado novamente até a próxima vez que novos dados chegam");
             */
            try {
            TimeUnit.MILLISECONDS.sleep(500); // 
        } catch (InterruptedException e) {
        }
        byte[] readBuffer = new byte[1024];
        try {
            int numBytes = 0;
            while (inputStream.available() > 0) {
                numBytes = inputStream.read(readBuffer);
            }
            String result = new String(readBuffer);
            result = result.substring(0, numBytes);
            System.out.println(result + "\n");
        } catch (IOException e) {
        }

        break;
    }
}
1 curtida