如何从串口读取文本?

时间:2009-01-27 17:38:59

标签: java string serial-port bytearray

我试图通过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"));

前三行的输出不允许我复制和粘贴(我假设因为它们不是普通字符)。这是Hex的输出: 78786000e67e9e60061e8606781e66e0869e98e086f89898861878809e1e9880

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

我使用的用于通信的设置与C#应用程序中的工作完全相同: 波特率:9600 数据位:8 停止位:1 平价:无

3 个答案:

答案 0 :(得分:1)

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

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

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

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

答案 1 :(得分: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) { ... }

答案 2 :(得分: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+ "    ");

请我从二进制字符串