我正试图通过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
答案 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可能是另一个失败的来源。