我在Java和Arduino之间进行了双向通信,但是我发现当从Java向Arduino发送数据时,在草图中显示大约需要3.5秒。
从Arduino发送到Java的数据没有这样的延迟。
知道为什么会这样吗?
Arduino代码。 这是我的主循环,
void loop() {
connection.sendData(systemVariables);
connection.receiveData(systemVariables);
world(systemVariables, ctr++);
}
这是发件人,
void sendData(SystemVariables &sv) {
String msg = String(sv.getReference());
String pstr = String(sv.getPosition(), 2);
msg = msg + "," ;
msg = msg + pstr;
msg = msg + "," ;
msg = msg + sv.getOutput();
Serial.println(msg);
}
这是接收器,
float receiveData(SystemVariables &sv) {
String str;
while (Serial.available() > 0) {
str = Serial.readStringUntil('\n');
Serial.print('>');
Serial.println(str);
}
if (str.length() > 0)
sv.setOutput( str.toFloat());
return sv.getOutput();
}
爪哇 Java循环有25ms的延迟。
接收器
public synchronized void serialEvent(SerialPortEvent oEvent) {
//System.out.println("ET " + oEvent.getEventType());
if (oEvent.getEventType() == SerialPortEvent.DATA_AVAILABLE) {
String inputLine = null;
try {
inputLine = input.readLine();
if (inputLine.length() > 0) {
logger.log(Level.INFO, "{0}", inputLine);
if (!inputLine.startsWith(">")) {
String[] arr = inputLine.split(",");
for (int i = 0; i < arr.length; i++) {
try {
float newf = Float.parseFloat(arr[i]);
try {
if (data.size() <= i) {
data.add(newf);
} else {
data.set(i, newf);
}
} catch (IndexOutOfBoundsException e) {
logger.warning(e.toString());
}
} catch (NumberFormatException e) {
logger.log(Level.WARNING, "{0} <{1}> <{2}>", new Object[]{e.toString(), inputLine, arr[i]});
}
}
}
}
} catch (IOException ex) {
Logger.getLogger(SerialSensorSingleton.class.getName()).log(Level.SEVERE, null, ex);
} catch (Exception e) {
logger.warning(e.toString() + " Data received " + inputLine == null ? "null" : "<" + inputLine + ">");
}
}
}
发件人
public void write(String s) throws IOException {
logger.log(Level.INFO, ":{0}", s);
output.write(s.getBytes());
output.flush();
}
答案 0 :(得分:0)
我现在已经解决了这个问题。问题是我试图用异步方法实现同步通信。
也就是说,我使用的是SerialEvent监听器,但这只适用于单向通信。我试图使用该端口以另一种方式发回数据,但它被一段时间内构建的数据队列阻止。
我已经将方法调用更改为读取和写入,以便每个端只发送一条消息,而不是等待传入的数据。通过这种方式,每个端都是同步的,现在它就像一个梦。