【问题标题】:How do I make a String from a bufferedreader with newline如何使用换行符从缓冲读取器中创建字符串
【发布时间】:2018-01-12 23:20:36
【问题描述】:

使用 System.out.print() 的串口数据示例

$GPGGA,134658.00,5106.9792,N,11402.3003,W,2,09,1.0,1048.47,M,-16.27,M,08,AAAA*60

此消息以回车符和换行符结束。 当我使用下面的代码时,我得到了这个输出。

$
G
P
G
G
A
,
.
.
.
   (Carriage return)
   (New Line)
$
G
P
G
S
A

我的目标是得到一个字符串,然后我可以用“,”分割。 我想在回车/换行符上重置/刷新该字符串。

    static class SerialPortReader implements SerialPortEventListener {

        public void serialEvent(SerialPortEvent event) {

            try {
                byte[] tester = serialPort.readBytes(1);

                //System.out.print(getdata);
                InputStream gpsStream = new ByteArrayInputStream(tester);

                BufferedReader in = new BufferedReader(new InputStreamReader(gpsStream, StandardCharsets.UTF_8));
                String output = in.readLine();
System.out.println(in);
            } catch (SerialPortException | IOException ex) {                  
            }    
        }
    }

假设这是控制台输出。我想解析最近的一行。在这种情况下,$GPGSA 字符串。

$GPGGA,134658.00,5106.9792,N,11402.3003,W,2,09,1.0,1048.47,M,-16.27,M,08,AAAA*60
$GPGSA,134658.00,W,2,09,1.0,1048.47,M,-16.27,M,08,AAAA*60

我想我的问题是如何将输入流转换为我可以解析的格式?

新编辑: 当我使用此代码时,它会准确地打印出我需要的方式。

如何复制 System.out.print();功能?

String wtf = serialPort.readString(event.getEventValue());
                System.out.print(wtf);

上述字符串的控制台输出:

 $GPGSA,M,3,30,11,28,07,01,17,08,13,,,,,2.3,1.2,2.0*3D
$GPGSV,3,1,12,30,74,226,33,11,64,090,31,28,55,317,32,07,55,169,27*75
$GPGSV,3,2,12,01,51,118,22,17,31,239,25,08,28,050,34,13,18,300,22*75
$GPGSV,3,3,12,48,22,240,,19,08,233,,15,01,324,,22,00,118,*7A

【问题讨论】:

  • 当您使用“下面的代码”时,您什么也得不到,因为“下面的代码”不会打印或写入任何内容。 --- 此外,readLine()永远返回回车符和换行符,所以如果你得到这些,你肯定不会使用readLine()
  • 查看我的编辑。此外,当我使用 println();
  • 怎么样:System.out.println(output);。您使用什么来保持阅读器打开以继续检索数据?你曾经关闭过任何东西吗?
  • 我正在从 GPS 接收器读取数据。我将使用 GUI 中的按钮将其关闭。

标签: java gps serial-port newline jssc


【解决方案1】:

对于每个 SerialPortEvent,您似乎只读取一个字节(=一个字母)

serialPort.readBytes(1);

然后您将这一个字母存储在 ByteArrayInputStream 中

要读取 ByteArrayInputStream,您使用的是 BufferedReader(当没有任何可缓冲的内容时,因为所有内容都已在您的 ByteArrayInputStream 中)来读取唯一可用的一个字母

现在我唯一需要知道的是:什么是

串口

?

编辑:

经过一番谷歌搜索,假设您正在使用 jssc

如果换行

serialPort.readBytes(1);

serialPort.readBytes(serialPort.getInputBufferBytesCount());

好点了吗?

如果是,那么您将需要一个 while 循环来围绕您的 readline 函数:

String output = null;
while((output=in.readLine()) != null){
    System.out.println(output);
}

【讨论】:

  • 这是不行的。不为我打印任何东西。
  • 但要点就在那里。您需要阅读超过 1 个字节。复制 system.out.print 函数是什么意思?
  • 如果我使用 String getdata = serialPort.readString(event.getEventValue()); System.out.print(getdata);正确打印整个字符串并拆分。我的理解是它会在读取换行符时填充缓冲区并刷新。
猜你喜欢
  • 2015-11-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多