【问题标题】:How do I read text from a serial port?如何从串口读取文本?
【发布时间】:2010-10-03 19:40:07
【问题描述】:

我正在尝试通过 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 奇偶校验:无

【问题讨论】:

  • @Jon Seigel - 我注意到您重新标记以清理 serialport 标签。我认为最喜欢的标签实际上是serial-port。感谢您的清理!

标签: java string serial-port bytearray


【解决方案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】:
     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+ "    ");
    

    请我从二进制字符串中提取字符串

    【讨论】:

      【解决方案3】:

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

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-11-17
        • 2017-09-06
        • 2014-10-01
        • 1970-01-01
        相关资源
        最近更新 更多