我试图通过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 平价:无
答案 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.BufferedReader
或java.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+ " ");
请我从二进制字符串