1

我正在尝试通过 Java 从 Windows 串行端口读取数据。我有 javax.comm 库并且能够获取一些数据但不正确的数据。当我将端口读入字节数组并将其转换为文本时,我得到一系列字符,但没有真正的文本字符串。我试图将字节数组指定为“UTF-8”和“US-ASCII”。有谁知道如何从中获取真实文本?

这是我的代码:

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"));

前三行的输出不会让我复制和粘贴(我假设因为它们不是普通字符)。这是十六进制的输出:78786000e67e9e60061e8606781e66e0869e98e086f89898861878809e1e9880

我正在从一个以字符串格式输出的 Hollux GPS 设备读取数据。我肯定知道这一点,因为我是通过 C# 完成的。

我在 C# 应用程序中使用的通信设置是:波特率:9600 数据位:8 停止位:1 奇偶校验:无

4

3 回答 3

1

连接的设备很可能不使用文本协议。许多设备使用二进制消息格式,其中可能嵌入了文本,但使用更紧凑的代码表示其他信息。

请编辑您的问题并提供更多信息,例如您通过串行端口与之通信的设备,以及您从正在运行的代码中获得的输出。要添加的另一个有用的输出是打印您已读取数据的十六进制表示形式。一个快速而肮脏的方法如下:

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

我没有使用过Holux GPS,但我用javax.comm 编写了一个Garmin 接口。在这种情况下,设备默认使用专有(二进制)Garmin 协议,但可以在设备上启用(基于文本的)NMEA 0183 协议。您是否可能正在接收专有的 Holux 消息格式,并且需要在 GPS 单元上使用一些命令来切换协议?

于 2009-01-27T17:49:27.420 回答
1

我无法从您的代码中看出,但看起来您正在使用java.io.InputStream读取对象。您应该使用java.io.BufferedReaderjava.io.InputSreamReader

有很多方法可以做到这一点,但这是我们使用的:

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

try {
    String line = portReader.readLine();
} catch(IOException e) { ... }
于 2009-01-28T13:59:51.970 回答
0
 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+ "    ");

请我从二进制字符串

于 2016-06-02T12:33:02.433 回答