java串行通信期间的数据丢失

java串行通信期间的数据丢失,java,Java,我正试图从arduino板接收一个遥测字符串,并通过jserialcomm将其发送到javafx应用程序。 我的arduino输出频率现在约为100Hz。在这种情况下,我希望在应用程序中接收大约1Hz的数据。这就是我正在做的: 这只是代码的一些重要部分: Runnable r1 = new Runnable() { public void run() { try { while (true) {

我正试图从arduino板接收一个遥测字符串,并通过jserialcomm将其发送到javafx应用程序。 我的arduino输出频率现在约为100Hz。在这种情况下,我希望在应用程序中接收大约1Hz的数据。这就是我正在做的: 这只是代码的一些重要部分:

  Runnable r1 = new Runnable() {
            public void run() {
              try {
                while (true) {
                  refresher(rx);
                  Thread.sleep(1000L);
                }
              } catch (InterruptedException iex) {}
            }
          };
       Thread thr1 = new Thread(r1);
       thr1.start();




public void refresher(SerialPort rx){

                  readRX(rx);

    parseString(lastTelemetry);


}


private void readRX(SerialPort rx){
   Scanner ss = new Scanner(rx.getInputStream()); 
                    while(ss.hasNextLine()){
                        lastTelemetry = ss.nextLine();
                        if (lastTelemetry.isEmpty()) continue;
                        System.out.println(lastTelemetry);
                        break;
                    }
}
但接收的字符串不完整。有些行已完成,有些行已丢失。我的输出是这样的:

8,03301306.4286586.00,0,31.36,0,0,0,0,0,0,62.27,-6.81,4.53,0.00,00 0,0,0,0,0,0,0,0,66.24,-6.81,4.52,-0.30,00 1.36,0,0,0,0,0,0,0,0,70.22,-6.81,4.52,-0.10,00
7098,03961306.3386587.00,0,31.36,0,0,0,0,0,0,0,0,75.22,-6.81,4.51,-0.10,00

您可能不应该每次读取输入时都创建新的输入流
新扫描仪(rx.getInputStream())
。如果正在缓冲数据,则在生成新流时,数据可能会丢失。打开串行端口时创建一次输入流,并将其作为参数传递给
readRX
方法,而不是
SerialPort


另外,我在Javadoc的粗略读取中找不到任何指定缓冲区大小的内容,或者如果缓冲区溢出会发生什么情况。这是另一个需要考虑的因素。

我认为HasNeXLoT()的定义存在问题。 请参见以下示例:

byte[] data = "test".getBytes();
ByteArrayInputStream inputStream = new ByteArrayInputStream(data);
Scanner scanner = new Scanner(inputStream);
while (scanner.hasNextLine()) {
    String text = scanner.nextLine();
    System.out.println(text);
}
结尾没有\n或类似的内容。但它仍然输出“test”。所以我希望你对下一行的部分采取不同的行为。
其他人也提到过,cachine可能是一个额外的故障源。

关于数据丢失,我的意思是它们的长度不同。我没有得到所有逗号分隔的数据。我所要做的就是每1秒接收一行,并对其进行解析和处理。
1hz
是每秒一个周期。我认为你需要在Arduino上增加时钟规则并限制它(或者你可以在主机设备上增加一个更大的缓冲区)。我不是专家:)你能再解释一点吗?我该怎么做?只创建一次你的
扫描仪
(正如@JimGarrison)在下面指出的那样,您可以使用
BufferedInputStream
new Scanner(new BufferedInputStream(rx.getInputStream(),1024*32))
一样包装
InputStream
(例如,对于32k缓冲区)。至于,有你可以用的。谢谢,它似乎解决了问题,但现在4-5线后,我得到了边界异常。我现在正在做这件事。让我知道,如果你有任何想法太。。。无论如何,你应该问一个显示更新代码的新问题,并确保包含完整的堆栈跟踪。另外,在代码中标识引发异常的行。如果异常不在代码中,您可能必须查看堆栈,以确定代码中调用抛出异常的库方法的行。我正在处理异常。。我将再次询问,如果我无法解决它,可能它的行为与文本结尾相同,并且在您在这里所说的示例中\n