如何从串口读取文本?

如何从串口读取文本?

问题描述:

我想通过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 奇偶校验:无

+0

@乔恩赛格尔 - 我注意到你重新标记清理`serial`和`port`标签。我认为最喜欢的标签实际上是`串行端口`。感谢您的清理! – mtrw 2010-03-20 20:17:22

我无法从您的代码中知道,但看起来您正在使用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) { ... } 

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

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

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

我还没有与长天GPS的工作,但我已经写与javax.comm仪接口。在这种情况下,该设备默认使用专有(二进制)Garmin协议,但可以在设备上启用(基于文本的)NMEA 0183协议。是否有可能收到专有的Holux消息格式,并且需要使用GPS单元上的某些命令来切换协议?

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

请我到字符串从二进制