【问题标题】:Slow serial transfer from Java to Arduino从 Java 到 Arduino 的慢速串行传输
【发布时间】:2016-03-30 20:54:59
【问题描述】:

我在 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 Java 循环有 25 毫秒的延迟。

接收者

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

【问题讨论】:

  • 难道不仅仅是处理 arduino 上的信息并在草图中显示所需的时间吗?
  • 不,只有几毫秒。

标签: java arduino


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-10-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多