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

时间:2016-03-05 19:37:39

标签: java

我正试图通过jserialcomm接收从arduino板到javafx apllication的遥测字符串。 我的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,0,330,1306.42,86586.00,0,31.36,0,0,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,0,396,1306.33,86587.00,0,31.36,0,0,0,0,0,0,0,0,75.22,-6.81,4.51,-0.10,00

2 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:0)

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

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或类似的东西。但它仍然输出“测试”。所以我希望你假设下一行的不同行为。 其他人也提到过,cachine可能是另一个失败的来源。