Pergunta

Eu estou tentando ler dados de uma porta serial do Windows através de Java. Eu tenho as bibliotecas javax.comm e sou capaz de obter alguns dados, mas não de dados corretos. Quando eu li o porto em um array de bytes e convertê-lo em texto eu recebo uma série de personagens, mas nenhuma cadeia de texto real. Tentei especificar a matriz de bytes como sendo tanto "UTF-8" e "US-ASCII". Alguém sabe como obter texto real fora deste?

Aqui está o meu código:

while (inputStream.available() > 0) {
 int numBytes = inputStream.read(readBuffer);
 System.out.println("Reading from " + portId.getName() + ": ");
 System.out.println("Read " + numBytes + " bytes");
}

System.out.println(new String(readBuffer));
System.out.println(new String(readBuffer, "UTF-8"));
System.out.println(new String(readBuffer, "US-ASCII"));

a saída das três primeiras linhas não me deixa copiar e colar (eu assumo porque eles não são caracteres normais). Aqui está a saída do Hex: 78786000e67e9e60061e8606781e66e0869e98e086f89898861878809e1e9880

Estou lendo de um dispositivo Hollux GPS que faz de saída no formato de cadeia. Eu sei que isso com certeza porque eu fiz isso através de C #.

As configurações que estou usando para a comunicação que eu conheço são desde o trabalho no C # aplicativo são: Baud Rate: 9600 Databits: 8 Bit de parada: 1 Paridade: Nenhuma

Foi útil?

Solução

Eu não posso dizer do seu código, mas parece que você está usando java.io.InputStream para ler o objeto. Você deve usar java.io.BufferedReader ou java.io.InputSreamReader.

Existem muitas maneiras de fazer isso, mas isso é o que usamos:

javax.comm.SerialPort port = ...{initialize your serial port}
BufferedReader portReader = 
    new BufferedReader(new InputStreamReader(port.getInputStream()));

try {
    String line = portReader.readLine();
} catch(IOException e) { ... }

Outras dicas

É provável que o dispositivo conectado não usa um protocolo de texto. Muitos dispositivos utilizam um formato de mensagem binária que pode ter texto embutido nele, mas representa outra informação com os códigos mais compactos.

Por favor edite sua pergunta e fornecer mais informações, tais como o dispositivo que você está se comunicando com o através da porta serial, ea saída que você começa a partir do código que você tem em execução. Outra saída útil para adicionar seria algo que imprime uma representação hexadecimal dos dados que você leu. Um método rápido e sujo para isso é a seguinte:

import java.math.BigInteger;
...
System.out.println(new BigInteger(1, readBuffer).toString(16));

Eu não tenho trabalhado com Holux GPS, mas eu ter escrito uma interface Garmin com javax.comm. Nesse caso, a unidade utiliza um proprietário (binário) Garmin protocolo por padrão, mas o protocolo NMEA 0183 (baseada em texto) pode ser ativado no dispositivo. É possível que você está recebendo um formato de mensagem Holux proprietário, e necessidade de usar algum comando na unidade GPS para protocolos de comutação?

 byte[] readBuffer = null;
                try {
                    while (inputStream.available() > 0) {
                        int n = inputStream.available();
                        readBuffer = new byte[n];
                        inputStream.read(readBuffer, 0, n);
                    }
                    String y = new String(readBuffer, StandardCharsets.ISO_8859_1);
                    String str = new String(readBuffer, "UTF-8");
                    jTextField3.setText("    " + str+ "    ");

Por favor me para string de binário

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top