从Java到Arduino的慢速串行传输

时间:2016-03-21 16:00:31

标签: java arduino

我在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();
    }

1 个答案:

答案 0 :(得分:0)

我现在已经解决了这个问题。问题是我试图用异步方法实现同步通信。

也就是说,我使用的是SerialEvent监听器,但这只适用于单向通信。我试图使用该端口以另一种方式发回数据,但它被一段时间内构建的数据队列阻止。

我已经将方法调用更改为读取和写入,以便每个端只发送一条消息,而不是等待传入的数据。通过这种方式,每个端都是同步的,现在它就像一个梦。